Compare commits
6 Commits
88639ab7aa
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2299066caf | ||
|
|
e559603c49 | ||
|
|
51279f2bb6 | ||
|
|
a3f68b4c1b | ||
|
|
311a9f69f4 | ||
|
|
2abafb5699 |
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(hugo:*)"
|
||||
],
|
||||
"deny": []
|
||||
}
|
||||
}
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -7,3 +7,5 @@
|
||||
/.hugo_build.lock
|
||||
static/apt
|
||||
.working
|
||||
settings.local.json
|
||||
.amplified
|
||||
|
||||
106
CLAUDE.md
Normal file
106
CLAUDE.md
Normal file
@@ -0,0 +1,106 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Project Overview
|
||||
|
||||
This is a Hugo static site for the Wild Cloud platform (mywildcloud.org) that serves multiple purposes:
|
||||
- Marketing and documentation website
|
||||
- APT repository for Debian packages
|
||||
- UI component distribution system
|
||||
- Community hub for the Wild Cloud ecosystem
|
||||
|
||||
## Development Commands
|
||||
|
||||
### Prerequisites
|
||||
- Install Hugo (minimum v0.87.0)
|
||||
- Install dart-sass
|
||||
|
||||
### Development Server
|
||||
```bash
|
||||
hugo server -D
|
||||
```
|
||||
|
||||
### Build and Deploy
|
||||
```bash
|
||||
scripts/deploy.sh
|
||||
```
|
||||
|
||||
The deploy script performs:
|
||||
1. `hugo build` - Generates static site in `public/` directory
|
||||
2. `docker build -t payneio/mywildcloud.org .` - Creates Docker image with nginx:alpine
|
||||
3. `docker push payneio/mywildcloud.org` - Pushes to registry
|
||||
4. `kubectl rollout restart deployment mywildcloud -n mywildcloud` - Deploys to Kubernetes
|
||||
|
||||
## Architecture
|
||||
|
||||
### Theme Configuration
|
||||
- **Theme:** Blowfish v2+ (modern Hugo theme)
|
||||
- **Color Scheme:** "blowfish" with light default appearance
|
||||
- **Layout:** Custom homepage layout with basic header
|
||||
- **Custom Assets:** Wild Cloud logo and custom CSS in `/assets/`
|
||||
- Uses tailwindcss for styling
|
||||
|
||||
### Content Structure
|
||||
- **Main Pages:** Homepage, About, Get Started, Contribute
|
||||
- **Additional Areas:** Foundation, Learning, Projects (generated content)
|
||||
- **Special Content:** APT repository hosting and UI releases
|
||||
|
||||
### Key Features
|
||||
- **APT Repository:** Complete Debian package repository in `/static/apt/`
|
||||
- Packages for `wild-cloud-central` (multiple versions, amd64/arm64)
|
||||
- GPG signing and repository metadata
|
||||
- Installation script (`install-apt.sh`)
|
||||
- **UI Releases:** Versioned UI component releases in `/ui-releases/`
|
||||
- JSON manifest with version, archive URLs, and checksums
|
||||
- **Analytics:** Google Analytics integration (G-YSHP7PL9R1)
|
||||
- **SEO:** XML sitemap, robots.txt, and meta tags configured
|
||||
|
||||
### Configuration Files
|
||||
- **Hugo Config:** `config/_default/hugo.toml` - Main site configuration
|
||||
- **Theme Config:** `config/_default/params.toml` - Blowfish theme settings
|
||||
- **Menus:** `config/_default/menus.en.toml` - Navigation structure
|
||||
- **Markup:** `config/_default/markup.toml` - Content rendering options
|
||||
|
||||
### Deployment Architecture
|
||||
- **Development:** Local Hugo server with draft content
|
||||
- **Production:** Containerized deployment using Docker + Kubernetes
|
||||
- **Base URL:** https://www.mywildcloud.org/
|
||||
- **Container:** nginx:alpine serving static files from `/usr/share/nginx/html`
|
||||
|
||||
## Theme Customization
|
||||
|
||||
### Custom CSS
|
||||
- Location: `/assets/css/custom.css`
|
||||
- Custom font implementation and Wild Cloud branding
|
||||
|
||||
### Custom Layouts
|
||||
- Homepage override: `/layouts/home.html`
|
||||
- Uses basic header layout instead of default theme layout
|
||||
|
||||
### Theme Features Configuration
|
||||
- **Enabled:** Search, auto appearance switching, breadcrumbs, table of contents
|
||||
- **Disabled:** Author info, dates, views, likes, comments
|
||||
- **Analytics:** Google Analytics integration
|
||||
- **Social:** Meta tags and social sharing configured
|
||||
|
||||
## Content Management
|
||||
|
||||
### Taxonomies
|
||||
- Tags, categories, authors, series
|
||||
- Weighted related content indices
|
||||
|
||||
### Content Types
|
||||
- Standard markdown pages
|
||||
- Foundation/principles content
|
||||
- Learning resources
|
||||
- Project documentation
|
||||
- Package repository metadata
|
||||
|
||||
## Important Notes
|
||||
|
||||
- The site doubles as a software distribution platform with integrated APT repository
|
||||
- All content changes require rebuilding and redeploying the Docker container
|
||||
- The Kubernetes deployment uses rolling updates for zero-downtime deployments
|
||||
- Package distribution is handled through static file serving from `/static/apt/`
|
||||
- UI releases are distributed via JSON manifest and tarball system
|
||||
@@ -1,4 +1,4 @@
|
||||
/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
|
||||
/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
|
||||
/*! Blowfish | MIT License | https://github.com/nunocoracao/blowfish */
|
||||
@layer properties;
|
||||
#zen-mode-button {
|
||||
@@ -421,6 +421,9 @@ body.zen-mode-enable {
|
||||
::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {
|
||||
padding-block: 0;
|
||||
}
|
||||
::-webkit-calendar-picker-indicator {
|
||||
line-height: 1;
|
||||
}
|
||||
:-moz-ui-invalid {
|
||||
box-shadow: none;
|
||||
}
|
||||
@@ -460,7 +463,7 @@ body.zen-mode-enable {
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
clip-path: inset(50%);
|
||||
white-space: nowrap;
|
||||
border-width: 0;
|
||||
}
|
||||
@@ -491,9 +494,6 @@ body.zen-mode-enable {
|
||||
.top-0 {
|
||||
top: calc(var(--spacing) * 0);
|
||||
}
|
||||
.top-1 {
|
||||
top: calc(var(--spacing) * 1);
|
||||
}
|
||||
.top-1\/2 {
|
||||
top: calc(1/2 * 100%);
|
||||
}
|
||||
@@ -515,9 +515,6 @@ body.zen-mode-enable {
|
||||
.left-0 {
|
||||
left: calc(var(--spacing) * 0);
|
||||
}
|
||||
.left-1 {
|
||||
left: calc(var(--spacing) * 1);
|
||||
}
|
||||
.left-1\/2 {
|
||||
left: calc(1/2 * 100%);
|
||||
}
|
||||
@@ -720,7 +717,7 @@ body.zen-mode-enable {
|
||||
}
|
||||
:where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) {
|
||||
border-color: var(--tw-prose-hr);
|
||||
border-top-width: 1;
|
||||
border-top-width: 1px;
|
||||
margin-top: 3em;
|
||||
margin-bottom: 3em;
|
||||
}
|
||||
@@ -805,7 +802,7 @@ body.zen-mode-enable {
|
||||
font-weight: 600;
|
||||
font-family: inherit;
|
||||
color: var(--tw-prose-kbd);
|
||||
box-shadow: 0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%), 0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%);
|
||||
box-shadow: 0 0 0 1px var(--tw-prose-kbd-shadows), 0 3px 0 var(--tw-prose-kbd-shadows);
|
||||
font-size: 0.9rem;
|
||||
border-radius: 0.25rem;
|
||||
padding-top: 0.1875em;
|
||||
@@ -951,7 +948,7 @@ body.zen-mode-enable {
|
||||
--tw-prose-quote-borders: rgba(var(--color-primary-200), 1);
|
||||
--tw-prose-captions: rgba(var(--color-neutral-500), 1);
|
||||
--tw-prose-kbd: oklch(21% 0.034 264.665);
|
||||
--tw-prose-kbd-shadows: NaN NaN NaN;
|
||||
--tw-prose-kbd-shadows: color-mix(in oklab, oklch(21% 0.034 264.665) 10%, transparent);
|
||||
--tw-prose-code: rgba(var(--color-secondary-700), 1);
|
||||
--tw-prose-pre-code: rgba(var(--color-neutral-700), 1);
|
||||
--tw-prose-pre-bg: rgba(var(--color-neutral-50), 1);
|
||||
@@ -969,7 +966,7 @@ body.zen-mode-enable {
|
||||
--tw-prose-invert-quote-borders: rgba(var(--color-primary-900), 1);
|
||||
--tw-prose-invert-captions: rgba(var(--color-neutral-400), 1);
|
||||
--tw-prose-invert-kbd: #fff;
|
||||
--tw-prose-invert-kbd-shadows: 255 255 255;
|
||||
--tw-prose-invert-kbd-shadows: rgb(255 255 255 / 10%);
|
||||
--tw-prose-invert-code: rgba(var(--color-secondary-400), 1);
|
||||
--tw-prose-invert-pre-code: rgba(var(--color-neutral-200), 1);
|
||||
--tw-prose-invert-pre-bg: rgba(var(--color-neutral-700), 1);
|
||||
@@ -1317,9 +1314,6 @@ body.zen-mode-enable {
|
||||
.h-0 {
|
||||
height: calc(var(--spacing) * 0);
|
||||
}
|
||||
.h-1 {
|
||||
height: calc(var(--spacing) * 1);
|
||||
}
|
||||
.h-1\/2 {
|
||||
height: calc(1/2 * 100%);
|
||||
}
|
||||
@@ -1512,9 +1506,6 @@ body.zen-mode-enable {
|
||||
.shrink-0 {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.flex-grow {
|
||||
flex-grow: 1;
|
||||
}
|
||||
.grow {
|
||||
flex-grow: 1;
|
||||
}
|
||||
@@ -1527,10 +1518,6 @@ body.zen-mode-enable {
|
||||
.border-collapse {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.-translate-x-1 {
|
||||
--tw-translate-x: calc(var(--spacing) * -1);
|
||||
translate: var(--tw-translate-x) var(--tw-translate-y);
|
||||
}
|
||||
.-translate-x-1\/2 {
|
||||
--tw-translate-x: calc(calc(1/2 * 100%) * -1);
|
||||
translate: var(--tw-translate-x) var(--tw-translate-y);
|
||||
@@ -1543,10 +1530,6 @@ body.zen-mode-enable {
|
||||
--tw-translate-x: 100%;
|
||||
translate: var(--tw-translate-x) var(--tw-translate-y);
|
||||
}
|
||||
.-translate-y-1 {
|
||||
--tw-translate-y: calc(var(--spacing) * -1);
|
||||
translate: var(--tw-translate-x) var(--tw-translate-y);
|
||||
}
|
||||
.-translate-y-1\/2 {
|
||||
--tw-translate-y: calc(calc(1/2 * 100%) * -1);
|
||||
translate: var(--tw-translate-x) var(--tw-translate-y);
|
||||
@@ -1604,6 +1587,9 @@ body.zen-mode-enable {
|
||||
.appearance-none {
|
||||
appearance: none;
|
||||
}
|
||||
.grid-cols-3 {
|
||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||
}
|
||||
.flex-col {
|
||||
flex-direction: column;
|
||||
}
|
||||
@@ -1874,9 +1860,6 @@ body.zen-mode-enable {
|
||||
.bg-black {
|
||||
background-color: #000;
|
||||
}
|
||||
.bg-cyan-100 {
|
||||
background-color: oklch(95.6% 0.045 203.388);
|
||||
}
|
||||
.bg-gray-100 {
|
||||
background-color: oklch(96.7% 0.003 264.542);
|
||||
}
|
||||
@@ -1901,9 +1884,6 @@ body.zen-mode-enable {
|
||||
.bg-neutral-300 {
|
||||
background-color: rgba(var(--color-neutral-300), 1);
|
||||
}
|
||||
.bg-neutral-500 {
|
||||
background-color: rgba(var(--color-neutral-500), 1);
|
||||
}
|
||||
.bg-neutral-500\/50 {
|
||||
background-color: color-mix(in srgb, rgba(rgba(var(--color-neutral-500), 1), 1) 50%, transparent);
|
||||
@supports (color: color-mix(in lab, red, red)) {
|
||||
@@ -1934,15 +1914,9 @@ body.zen-mode-enable {
|
||||
.bg-transparent {
|
||||
background-color: transparent;
|
||||
}
|
||||
.bg-violet-100 {
|
||||
background-color: oklch(94.3% 0.029 294.588);
|
||||
}
|
||||
.bg-violet-200 {
|
||||
background-color: oklch(89.4% 0.057 293.283);
|
||||
}
|
||||
.bg-violet-300 {
|
||||
background-color: oklch(81.1% 0.111 293.571);
|
||||
}
|
||||
.bg-white {
|
||||
background-color: #fff;
|
||||
}
|
||||
@@ -2010,15 +1984,9 @@ body.zen-mode-enable {
|
||||
.p-0 {
|
||||
padding: calc(var(--spacing) * 0);
|
||||
}
|
||||
.p-1 {
|
||||
padding: calc(var(--spacing) * 1);
|
||||
}
|
||||
.p-1\.5 {
|
||||
padding: calc(var(--spacing) * 1.5);
|
||||
}
|
||||
.p-2 {
|
||||
padding: calc(var(--spacing) * 2);
|
||||
}
|
||||
.p-2\.5 {
|
||||
padding: calc(var(--spacing) * 2.5);
|
||||
}
|
||||
@@ -2118,12 +2086,6 @@ body.zen-mode-enable {
|
||||
.pt-\[6px\] {
|
||||
padding-top: 6px;
|
||||
}
|
||||
.pt-\[7px\] {
|
||||
padding-top: 7px;
|
||||
}
|
||||
.pt-\[8px\] {
|
||||
padding-top: 8px;
|
||||
}
|
||||
.pr-0 {
|
||||
padding-right: calc(var(--spacing) * 0);
|
||||
}
|
||||
@@ -2291,15 +2253,9 @@ body.zen-mode-enable {
|
||||
.text-gray-500 {
|
||||
color: oklch(55.1% 0.027 264.364);
|
||||
}
|
||||
.text-gray-900 {
|
||||
color: oklch(21% 0.034 264.665);
|
||||
}
|
||||
.text-green-400 {
|
||||
color: oklch(79.2% 0.209 151.711);
|
||||
}
|
||||
.text-green-900 {
|
||||
color: oklch(39.3% 0.095 152.535);
|
||||
}
|
||||
.text-green-950 {
|
||||
color: oklch(26.6% 0.065 152.934);
|
||||
}
|
||||
@@ -2348,54 +2304,24 @@ body.zen-mode-enable {
|
||||
.text-primary-800 {
|
||||
color: rgba(var(--color-primary-800), 1);
|
||||
}
|
||||
.text-sky-700 {
|
||||
color: oklch(50% 0.134 242.749);
|
||||
}
|
||||
.text-sky-800 {
|
||||
color: oklch(44.3% 0.11 240.79);
|
||||
}
|
||||
.text-sky-900 {
|
||||
color: oklch(39.1% 0.09 240.876);
|
||||
}
|
||||
.text-transparent {
|
||||
color: transparent;
|
||||
}
|
||||
.text-violet-50 {
|
||||
color: oklch(96.9% 0.016 293.756);
|
||||
}
|
||||
.text-violet-100 {
|
||||
color: oklch(94.3% 0.029 294.588);
|
||||
}
|
||||
.text-violet-800 {
|
||||
color: oklch(43.2% 0.232 292.759);
|
||||
}
|
||||
.text-violet-900 {
|
||||
color: oklch(38% 0.189 293.745);
|
||||
}
|
||||
.text-violet-950 {
|
||||
color: oklch(28.3% 0.141 291.089);
|
||||
}
|
||||
.text-white {
|
||||
color: #fff;
|
||||
}
|
||||
.text-yellow-50 {
|
||||
color: oklch(98.7% 0.026 102.212);
|
||||
}
|
||||
.text-yellow-100 {
|
||||
color: oklch(97.3% 0.071 103.193);
|
||||
}
|
||||
.text-yellow-200 {
|
||||
color: oklch(94.5% 0.129 101.54);
|
||||
}
|
||||
.text-yellow-300 {
|
||||
color: oklch(90.5% 0.182 98.111);
|
||||
}
|
||||
.text-yellow-400 {
|
||||
color: oklch(85.2% 0.199 91.936);
|
||||
}
|
||||
.text-yellow-800 {
|
||||
color: oklch(47.6% 0.114 61.907);
|
||||
}
|
||||
.capitalize {
|
||||
text-transform: capitalize;
|
||||
}
|
||||
@@ -2529,12 +2455,8 @@ body.zen-mode-enable {
|
||||
-webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
|
||||
backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
|
||||
}
|
||||
.backdrop-filter {
|
||||
-webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
|
||||
backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
|
||||
}
|
||||
.transition {
|
||||
transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, visibility, content-visibility, overlay, pointer-events;
|
||||
transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;
|
||||
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
|
||||
transition-duration: var(--tw-duration, var(--default-transition-duration));
|
||||
}
|
||||
@@ -2764,7 +2686,6 @@ body.zen-mode-enable {
|
||||
}
|
||||
.after\:content-\[\'\'\] {
|
||||
&::after {
|
||||
content: var(--tw-content);
|
||||
--tw-content: '';
|
||||
content: var(--tw-content);
|
||||
}
|
||||
@@ -3622,26 +3543,11 @@ body.zen-mode-enable {
|
||||
}
|
||||
}
|
||||
}
|
||||
.dark\:bg-cyan-900 {
|
||||
&:is(.dark *) {
|
||||
background-color: oklch(39.8% 0.07 227.392);
|
||||
}
|
||||
}
|
||||
.dark\:bg-green-700 {
|
||||
&:is(.dark *) {
|
||||
background-color: oklch(52.7% 0.154 150.069);
|
||||
}
|
||||
}
|
||||
.dark\:bg-green-800 {
|
||||
&:is(.dark *) {
|
||||
background-color: oklch(44.8% 0.119 151.328);
|
||||
}
|
||||
}
|
||||
.dark\:bg-green-900 {
|
||||
&:is(.dark *) {
|
||||
background-color: oklch(39.3% 0.095 152.535);
|
||||
}
|
||||
}
|
||||
.dark\:bg-neutral-400 {
|
||||
&:is(.dark *) {
|
||||
background-color: rgba(var(--color-neutral-400), 1);
|
||||
@@ -3703,16 +3609,6 @@ body.zen-mode-enable {
|
||||
background-color: oklch(68.5% 0.169 237.323);
|
||||
}
|
||||
}
|
||||
.dark\:bg-sky-600 {
|
||||
&:is(.dark *) {
|
||||
background-color: oklch(58.8% 0.158 241.966);
|
||||
}
|
||||
}
|
||||
.dark\:bg-sky-700 {
|
||||
&:is(.dark *) {
|
||||
background-color: oklch(50% 0.134 242.749);
|
||||
}
|
||||
}
|
||||
.dark\:bg-violet-700 {
|
||||
&:is(.dark *) {
|
||||
background-color: oklch(49.1% 0.27 292.581);
|
||||
@@ -3747,11 +3643,6 @@ body.zen-mode-enable {
|
||||
color: oklch(96.2% 0.044 156.743);
|
||||
}
|
||||
}
|
||||
.dark\:text-green-300 {
|
||||
&:is(.dark *) {
|
||||
color: oklch(87.1% 0.15 154.449);
|
||||
}
|
||||
}
|
||||
.dark\:text-neutral {
|
||||
&:is(.dark *) {
|
||||
color: rgba(var(--color-neutral), 1);
|
||||
@@ -3807,16 +3698,6 @@ body.zen-mode-enable {
|
||||
color: oklch(97.7% 0.013 236.62);
|
||||
}
|
||||
}
|
||||
.dark\:text-sky-100 {
|
||||
&:is(.dark *) {
|
||||
color: oklch(95.1% 0.026 236.824);
|
||||
}
|
||||
}
|
||||
.dark\:text-sky-200 {
|
||||
&:is(.dark *) {
|
||||
color: oklch(90.1% 0.058 230.902);
|
||||
}
|
||||
}
|
||||
.dark\:text-violet-100 {
|
||||
&:is(.dark *) {
|
||||
color: oklch(94.3% 0.029 294.588);
|
||||
@@ -3827,11 +3708,6 @@ body.zen-mode-enable {
|
||||
color: oklch(89.4% 0.057 293.283);
|
||||
}
|
||||
}
|
||||
.dark\:text-violet-300 {
|
||||
&:is(.dark *) {
|
||||
color: oklch(81.1% 0.111 293.571);
|
||||
}
|
||||
}
|
||||
.dark\:text-white {
|
||||
&:is(.dark *) {
|
||||
color: #fff;
|
||||
@@ -4056,9 +3932,7 @@ button, [role="button"] {
|
||||
z-index: 10;
|
||||
width: calc(var(--spacing) * 20);
|
||||
cursor: pointer;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
border-top-right-radius: var(--radius-md);
|
||||
border-bottom-left-radius: var(--radius-md);
|
||||
@@ -4203,7 +4077,7 @@ pre {
|
||||
text-decoration: none !important;
|
||||
}
|
||||
@layer base {
|
||||
[type='text'],input:where(:not([type])),[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select {
|
||||
input:where([type='text']),input:where(:not([type])),input:where([type='email']),input:where([type='url']),input:where([type='password']),input:where([type='number']),input:where([type='date']),input:where([type='datetime-local']),input:where([type='month']),input:where([type='search']),input:where([type='tel']),input:where([type='time']),input:where([type='week']),select:where([multiple]),textarea,select {
|
||||
appearance: none;
|
||||
background-color: #fff;
|
||||
border-color: oklch(55.1% 0.027 264.364);
|
||||
@@ -4257,7 +4131,7 @@ pre {
|
||||
padding-right: 2.5rem;
|
||||
print-color-adjust: exact;
|
||||
}
|
||||
[multiple],[size]:where(select:not([size="1"])) {
|
||||
select:where([multiple]),select:where([size]:not([size="1"])) {
|
||||
background-image: initial;
|
||||
background-position: initial;
|
||||
background-repeat: unset;
|
||||
@@ -4265,7 +4139,7 @@ pre {
|
||||
padding-right: 0.75rem;
|
||||
print-color-adjust: unset;
|
||||
}
|
||||
[type='checkbox'],[type='radio'] {
|
||||
input:where([type='checkbox']),input:where([type='radio']) {
|
||||
appearance: none;
|
||||
padding: 0;
|
||||
print-color-adjust: exact;
|
||||
@@ -4282,13 +4156,13 @@ pre {
|
||||
border-width: 1px;
|
||||
--tw-shadow: 0 0 #0000;
|
||||
}
|
||||
[type='checkbox'] {
|
||||
input:where([type='checkbox']) {
|
||||
border-radius: 0px;
|
||||
}
|
||||
[type='radio'] {
|
||||
input:where([type='radio']) {
|
||||
border-radius: 100%;
|
||||
}
|
||||
[type='checkbox']:focus,[type='radio']:focus {
|
||||
input:where([type='checkbox']):focus,input:where([type='radio']):focus {
|
||||
outline: 2px solid transparent;
|
||||
outline-offset: 2px;
|
||||
--tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
|
||||
@@ -4299,30 +4173,30 @@ pre {
|
||||
--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
|
||||
box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
||||
}
|
||||
[type='checkbox']:checked,[type='radio']:checked {
|
||||
input:where([type='checkbox']):checked,input:where([type='radio']):checked {
|
||||
border-color: transparent;
|
||||
background-color: currentColor;
|
||||
background-size: 100% 100%;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
[type='checkbox']:checked {
|
||||
input:where([type='checkbox']):checked {
|
||||
background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");
|
||||
@media (forced-colors: active) {
|
||||
appearance: auto;
|
||||
}
|
||||
}
|
||||
[type='radio']:checked {
|
||||
input:where([type='radio']):checked {
|
||||
background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
|
||||
@media (forced-colors: active) {
|
||||
appearance: auto;
|
||||
}
|
||||
}
|
||||
[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus {
|
||||
input:where([type='checkbox']):checked:hover,input:where([type='checkbox']):checked:focus,input:where([type='radio']):checked:hover,input:where([type='radio']):checked:focus {
|
||||
border-color: transparent;
|
||||
background-color: currentColor;
|
||||
}
|
||||
[type='checkbox']:indeterminate {
|
||||
input:where([type='checkbox']):indeterminate {
|
||||
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");
|
||||
border-color: transparent;
|
||||
background-color: currentColor;
|
||||
@@ -4333,11 +4207,11 @@ pre {
|
||||
appearance: auto;
|
||||
}
|
||||
}
|
||||
[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {
|
||||
input:where([type='checkbox']):indeterminate:hover,input:where([type='checkbox']):indeterminate:focus {
|
||||
border-color: transparent;
|
||||
background-color: currentColor;
|
||||
}
|
||||
[type='file'] {
|
||||
input:where([type='file']) {
|
||||
background: unset;
|
||||
border-color: inherit;
|
||||
border-width: 0;
|
||||
@@ -4346,7 +4220,7 @@ pre {
|
||||
font-size: unset;
|
||||
line-height: inherit;
|
||||
}
|
||||
[type='file']:focus {
|
||||
input:where([type='file']):focus {
|
||||
outline: 1px solid ButtonText;
|
||||
outline: 1px auto -webkit-focus-ring-color;
|
||||
}
|
||||
|
||||
@@ -6,3 +6,268 @@
|
||||
html {
|
||||
font-family: font;
|
||||
} */
|
||||
|
||||
/* Grid layout for get-started hardware section */
|
||||
.grid {
|
||||
display: grid;
|
||||
}
|
||||
|
||||
.grid-cols-3 {
|
||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.gap-4 {
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
/* Responsive: stack on mobile */
|
||||
@media (max-width: 768px) {
|
||||
.grid-cols-3 {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
/* App directory - filter buttons */
|
||||
.app-filters {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.5rem;
|
||||
justify-content: center;
|
||||
margin: 1.5rem 0;
|
||||
padding: 1rem;
|
||||
background: var(--color-neutral-100);
|
||||
border-radius: 0.75rem;
|
||||
}
|
||||
|
||||
.dark .app-filters {
|
||||
background: var(--color-neutral-800);
|
||||
}
|
||||
|
||||
.filter-btn {
|
||||
padding: 0.4rem 0.75rem;
|
||||
font-size: 0.75rem;
|
||||
font-weight: 500;
|
||||
border: 1px solid var(--color-neutral-300);
|
||||
border-radius: 1rem;
|
||||
background: white;
|
||||
color: var(--color-neutral-700);
|
||||
cursor: pointer;
|
||||
transition: all 0.15s ease;
|
||||
}
|
||||
|
||||
.dark .filter-btn {
|
||||
border-color: var(--color-neutral-600);
|
||||
background: var(--color-neutral-700);
|
||||
color: var(--color-neutral-300);
|
||||
}
|
||||
|
||||
.filter-btn:hover {
|
||||
background: var(--color-neutral-100);
|
||||
border-color: var(--color-neutral-400);
|
||||
}
|
||||
|
||||
.dark .filter-btn:hover {
|
||||
background: var(--color-neutral-600);
|
||||
border-color: var(--color-neutral-500);
|
||||
}
|
||||
|
||||
.filter-btn.active {
|
||||
background: #2563eb !important;
|
||||
border-color: #2563eb !important;
|
||||
color: #ffffff !important;
|
||||
text-decoration: none !important;
|
||||
border-bottom: none !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
.dark .filter-btn.active {
|
||||
background: #3b82f6 !important;
|
||||
border-color: #3b82f6 !important;
|
||||
color: #ffffff !important;
|
||||
text-decoration: none !important;
|
||||
border-bottom: none !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
.filter-divider {
|
||||
width: 1px;
|
||||
height: 1.5rem;
|
||||
background: var(--color-neutral-300);
|
||||
margin: 0 0.25rem;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.dark .filter-divider {
|
||||
background: var(--color-neutral-600);
|
||||
}
|
||||
|
||||
.app-count {
|
||||
text-align: center;
|
||||
font-size: 0.8rem;
|
||||
color: var(--color-neutral-500);
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
/* App directory - icon grid */
|
||||
.app-showcase {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 1rem;
|
||||
justify-content: center;
|
||||
padding: 1.5rem;
|
||||
background: var(--color-neutral-50);
|
||||
border-radius: 0.75rem;
|
||||
margin: 1rem 0;
|
||||
/* Scrollable container - shows ~3 rows */
|
||||
max-height: 420px;
|
||||
overflow-y: auto;
|
||||
align-content: flex-start;
|
||||
}
|
||||
|
||||
/* Custom scrollbar styling */
|
||||
.app-showcase::-webkit-scrollbar {
|
||||
width: 8px;
|
||||
}
|
||||
|
||||
.app-showcase::-webkit-scrollbar-track {
|
||||
background: var(--color-neutral-200);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.app-showcase::-webkit-scrollbar-thumb {
|
||||
background: var(--color-neutral-400);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.app-showcase::-webkit-scrollbar-thumb:hover {
|
||||
background: var(--color-neutral-500);
|
||||
}
|
||||
|
||||
.dark .app-showcase::-webkit-scrollbar-track {
|
||||
background: var(--color-neutral-700);
|
||||
}
|
||||
|
||||
.dark .app-showcase::-webkit-scrollbar-thumb {
|
||||
background: var(--color-neutral-500);
|
||||
}
|
||||
|
||||
.dark .app-showcase::-webkit-scrollbar-thumb:hover {
|
||||
background: var(--color-neutral-400);
|
||||
}
|
||||
|
||||
.dark .app-showcase {
|
||||
background: var(--color-neutral-800);
|
||||
}
|
||||
|
||||
.app-icon {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
width: 110px;
|
||||
padding: 1rem 0.75rem;
|
||||
border-radius: 0.75rem;
|
||||
text-decoration: none;
|
||||
transition: all 0.15s ease;
|
||||
background: white;
|
||||
border: 1px solid #e5e7eb;
|
||||
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.dark .app-icon {
|
||||
background: #374151;
|
||||
border-color: #4b5563;
|
||||
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.app-icon:hover {
|
||||
transform: translateY(-3px);
|
||||
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.18);
|
||||
border-color: #93c5fd;
|
||||
}
|
||||
|
||||
.dark .app-icon:hover {
|
||||
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.5);
|
||||
border-color: #3b82f6;
|
||||
}
|
||||
|
||||
.app-icon img {
|
||||
width: 56px;
|
||||
height: 56px;
|
||||
object-fit: contain;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.app-icon span {
|
||||
font-size: 0.7rem;
|
||||
font-weight: 500;
|
||||
text-align: center;
|
||||
color: #374151;
|
||||
line-height: 1.2;
|
||||
max-width: 100%;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.dark .app-icon span {
|
||||
color: #d1d5db;
|
||||
}
|
||||
|
||||
/* Infrastructure icons - slightly smaller */
|
||||
.app-showcase-infra {
|
||||
gap: 0.75rem;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.app-showcase-infra .app-icon {
|
||||
width: 75px;
|
||||
padding: 0.5rem;
|
||||
}
|
||||
|
||||
.app-showcase-infra .app-icon img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
.app-showcase-infra .app-icon span {
|
||||
font-size: 0.6rem;
|
||||
}
|
||||
|
||||
/* Coming Soon diagonal corner ribbon */
|
||||
.app-icon.coming-soon {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.app-icon.coming-soon::before {
|
||||
content: 'SOON';
|
||||
position: absolute;
|
||||
top: 8px;
|
||||
right: -32px;
|
||||
width: 100px;
|
||||
padding: 4px 0;
|
||||
background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
|
||||
color: white;
|
||||
font-size: 0.5rem;
|
||||
font-weight: 800;
|
||||
text-align: center;
|
||||
letter-spacing: 0.1em;
|
||||
text-transform: uppercase;
|
||||
transform: rotate(45deg);
|
||||
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.dark .app-icon.coming-soon::before {
|
||||
background: linear-gradient(135deg, #f87171 0%, #ef4444 100%);
|
||||
}
|
||||
|
||||
.app-icon.coming-soon img {
|
||||
opacity: 0.6;
|
||||
filter: grayscale(20%);
|
||||
}
|
||||
|
||||
.app-icon.coming-soon:hover img {
|
||||
opacity: 1;
|
||||
filter: grayscale(0%);
|
||||
}
|
||||
|
||||
@@ -6,11 +6,11 @@ description: Wild Cloud is an Open Source, self-hosted, sovereign cloud platform
|
||||

|
||||
|
||||
|
||||
Wild clouds are Open Source, self-hosted, independent platforms for hosting your applications and services. Your wild cloud is your own private data center where you can host your own applications.
|
||||
Wild clouds are open source community-managed infrastructure for hosting applications and services. A wild cloud is a private data center run by communities for communities.
|
||||
|
||||
You can have your own wild cloud for the price of a smart phone and an Internet connection. You can scale your wild cloud as large as you like.
|
||||
Wild clouds are made of multiple computers connected in a cluster running on your own network. Once set up, applications for your community can be deployed to it with a few clicks. We make the most popular and high-quality apps available in our app store, but communities can host any software they'd like for their members. A simple wild cloud can be had for the price of a smart phone and can scale to support communities of all sizes.
|
||||
|
||||
While not a consumer product (yet), Wild Cloud aims to make self-hosting accessible to every individual and organization. Wild Cloud is a non-profit, community-driven project, educational in nature, designed to empower society to directly control its own data and services.
|
||||
Wild Cloud is an open source, forever free, non-profit, community-driven project, educational in nature, designed to empower society to directly control its own data and services.
|
||||
|
||||
This is a wild cloud:
|
||||
|
||||
@@ -22,12 +22,394 @@ This is also a wild cloud:
|
||||
|
||||
## Apps
|
||||
|
||||
In addition to helping you set up and manager your cloud, Wild Cloud gives you a set of Open Source applications you can run on your cloud.
|
||||
Deploy applications to your Wild Cloud with just a few clicks. We curate an ever-growing collection of open-source, high-quality applications most used by communities.
|
||||
|
||||
<div class="app-filters">
|
||||
<button class="filter-btn active" data-filter="all">All</button>
|
||||
<button class="filter-btn" data-filter="available">Available Now</button>
|
||||
<button class="filter-btn" data-filter="coming-soon">Coming Soon</button>
|
||||
<span class="filter-divider"></span>
|
||||
<button class="filter-btn" data-filter="ai">AI</button>
|
||||
<button class="filter-btn" data-filter="civic">Civic</button>
|
||||
<button class="filter-btn" data-filter="collaboration">Collaboration</button>
|
||||
<button class="filter-btn" data-filter="coop">Coop</button>
|
||||
<button class="filter-btn" data-filter="crm">CRM</button>
|
||||
<button class="filter-btn" data-filter="democracy">Democracy</button>
|
||||
<button class="filter-btn" data-filter="dev">Dev</button>
|
||||
<button class="filter-btn" data-filter="events">Events</button>
|
||||
<button class="filter-btn" data-filter="finance">Finance</button>
|
||||
<button class="filter-btn" data-filter="forms">Forms</button>
|
||||
<button class="filter-btn" data-filter="infra">Infrastructure</button>
|
||||
<button class="filter-btn" data-filter="knowledge">Knowledge</button>
|
||||
<button class="filter-btn" data-filter="learning">Learning</button>
|
||||
<button class="filter-btn" data-filter="maps">Maps</button>
|
||||
<button class="filter-btn" data-filter="media">Media</button>
|
||||
<button class="filter-btn" data-filter="nocode">No-Code</button>
|
||||
<button class="filter-btn" data-filter="projects">Projects</button>
|
||||
<button class="filter-btn" data-filter="publishing">Publishing</button>
|
||||
<button class="filter-btn" data-filter="sharing">Sharing</button>
|
||||
<button class="filter-btn" data-filter="social">Social</button>
|
||||
</div>
|
||||
|
||||
<div class="app-showcase" id="app-grid">
|
||||
<a href="https://akaunting.com/" class="app-icon coming-soon" data-category="finance" data-status="coming-soon" title="Accounting software">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/akaunting.svg" alt="Akaunting">
|
||||
<span>Akaunting</span>
|
||||
</a>
|
||||
<a href="https://alaveteli.org/" class="app-icon coming-soon" data-category="civic" data-status="coming-soon" title="FOI request platform">
|
||||
<img src="https://avatars.githubusercontent.com/u/79887" alt="Alaveteli">
|
||||
<span>Alaveteli</span>
|
||||
</a>
|
||||
<a href="https://baserow.io/" class="app-icon coming-soon" data-category="nocode" data-status="coming-soon" title="No-code database platform">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/baserow.svg" alt="Baserow">
|
||||
<span>Baserow</span>
|
||||
</a>
|
||||
<a href="https://www.belenios.org/" class="app-icon coming-soon" data-category="democracy" data-status="coming-soon" title="Verifiable voting system">
|
||||
<img src="https://avatars.githubusercontent.com/u/56809296" alt="Belenios">
|
||||
<span>Belenios</span>
|
||||
</a>
|
||||
<a href="https://bigbluebutton.org/" class="app-icon coming-soon" data-category="collaboration learning" data-status="coming-soon" title="Web conferencing for learning">
|
||||
<img src="https://avatars.githubusercontent.com/u/1908859" alt="BigBlueButton">
|
||||
<span>BigBlueButton</span>
|
||||
</a>
|
||||
<a href="https://www.bookstackapp.com/" class="app-icon coming-soon" data-category="knowledge" data-status="coming-soon" title="Self-hosted documentation">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/bookstack.svg" alt="BookStack">
|
||||
<span>BookStack</span>
|
||||
</a>
|
||||
<a href="https://bookwyrm.social/" class="app-icon coming-soon" data-category="social" data-status="coming-soon" title="Federated book social network">
|
||||
<img src="https://raw.githubusercontent.com/bookwyrm-social/bookwyrm/main/bookwyrm/static/images/logo.png" alt="BookWyrm">
|
||||
<span>BookWyrm</span>
|
||||
</a>
|
||||
<a href="https://chamilo.org/" class="app-icon coming-soon" data-category="learning" data-status="coming-soon" title="E-learning platform">
|
||||
<img src="https://avatars.githubusercontent.com/u/5037740" alt="Chamilo">
|
||||
<span>Chamilo</span>
|
||||
</a>
|
||||
<a href="https://civicrm.org/" class="app-icon coming-soon" data-category="crm" data-status="coming-soon" title="Nonprofit CRM">
|
||||
<img src="https://avatars.githubusercontent.com/u/112711" alt="CiviCRM">
|
||||
<span>CiviCRM</span>
|
||||
</a>
|
||||
<a href="https://consulproject.org/" class="app-icon coming-soon" data-category="democracy" data-status="coming-soon" title="Citizen participation platform">
|
||||
<img src="https://avatars.githubusercontent.com/u/7923311" alt="Consul">
|
||||
<span>Consul</span>
|
||||
</a>
|
||||
<a href="https://cryptpad.org/" class="app-icon coming-soon" data-category="collaboration" data-status="coming-soon" title="Encrypted collaborative docs">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/cryptpad.svg" alt="CryptPad">
|
||||
<span>CryptPad</span>
|
||||
</a>
|
||||
<a href="https://decidim.org/" class="app-icon" data-category="democracy" data-status="available" title="Participatory democracy platform">
|
||||
<img src="https://raw.githubusercontent.com/decidim/decidim/develop/logo.svg" alt="Decidim">
|
||||
<span>Decidim</span>
|
||||
</a>
|
||||
<a href="https://www.discourse.org/" class="app-icon" data-category="collaboration" data-status="available" title="Community discussion platform">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/discourse.svg" alt="Discourse">
|
||||
<span>Discourse</span>
|
||||
</a>
|
||||
<a href="https://etherpad.org/" class="app-icon coming-soon" data-category="collaboration" data-status="coming-soon" title="Real-time collaborative editor">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/etherpad.svg" alt="Etherpad">
|
||||
<span>Etherpad</span>
|
||||
</a>
|
||||
<a href="https://eventyay.com/" class="app-icon coming-soon" data-category="events" data-status="coming-soon" title="Event management platform">
|
||||
<img src="https://avatars.githubusercontent.com/u/7248242" alt="Eventyay">
|
||||
<span>Eventyay</span>
|
||||
</a>
|
||||
<a href="https://www.firefly-iii.org/" class="app-icon coming-soon" data-category="finance" data-status="coming-soon" title="Personal finance manager">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/firefly-iii.svg" alt="Firefly III">
|
||||
<span>Firefly III</span>
|
||||
</a>
|
||||
<a href="https://fixmystreet.org/" class="app-icon coming-soon" data-category="civic" data-status="coming-soon" title="Report local problems">
|
||||
<img src="https://avatars.githubusercontent.com/u/79887" alt="FixMyStreet">
|
||||
<span>FixMyStreet</span>
|
||||
</a>
|
||||
<a href="https://formbricks.com/" class="app-icon coming-soon" data-category="forms" data-status="coming-soon" title="Open source survey platform">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/formbricks.svg" alt="Formbricks">
|
||||
<span>Formbricks</span>
|
||||
</a>
|
||||
<a href="https://gancio.org/" class="app-icon coming-soon" data-category="social events" data-status="coming-soon" title="Shared agenda for communities">
|
||||
<img src="https://gancio.org/logo.svg" alt="Gancio">
|
||||
<span>Gancio</span>
|
||||
</a>
|
||||
<a href="https://ghost.org/" class="app-icon" data-category="publishing" data-status="available" title="Publishing platform">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/ghost.png" alt="Ghost">
|
||||
<span>Ghost</span>
|
||||
</a>
|
||||
<a href="https://about.gitea.com/" class="app-icon" data-category="dev" data-status="available" title="Self-hosted Git service">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/gitea.svg" alt="Gitea">
|
||||
<span>Gitea</span>
|
||||
</a>
|
||||
<a href="https://www.gnucash.org/" class="app-icon coming-soon" data-category="finance" data-status="coming-soon" title="Double-entry accounting">
|
||||
<img src="https://avatars.githubusercontent.com/u/8027736" alt="GnuCash">
|
||||
<span>GnuCash</span>
|
||||
</a>
|
||||
<a href="https://heliosvoting.org/" class="app-icon coming-soon" data-category="democracy" data-status="coming-soon" title="Verifiable online voting">
|
||||
<img src="https://avatars.githubusercontent.com/u/303693" alt="Helios">
|
||||
<span>Helios Voting</span>
|
||||
</a>
|
||||
<a href="https://immich.app/" class="app-icon" data-category="media" data-status="available" title="Photo & video backup">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/immich.svg" alt="Immich">
|
||||
<span>Immich</span>
|
||||
</a>
|
||||
<a href="https://getindico.io/" class="app-icon coming-soon" data-category="events" data-status="coming-soon" title="Event management from CERN">
|
||||
<img src="https://avatars.githubusercontent.com/u/3920772" alt="Indico">
|
||||
<span>Indico</span>
|
||||
</a>
|
||||
<a href="https://jitsi.org/" class="app-icon coming-soon" data-category="collaboration" data-status="coming-soon" title="Video conferencing">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/jitsi.svg" alt="Jitsi">
|
||||
<span>Jitsi</span>
|
||||
</a>
|
||||
<a href="https://karrot.world/" class="app-icon coming-soon" data-category="sharing coop" data-status="coming-soon" title="Grassroots coordination">
|
||||
<img src="https://avatars.githubusercontent.com/u/18049498" alt="Karrot">
|
||||
<span>Karrot</span>
|
||||
</a>
|
||||
<a href="https://www.keila.io/" class="app-icon" data-category="crm" data-status="available" title="Email marketing">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/keila.svg" alt="Keila">
|
||||
<span>Keila</span>
|
||||
</a>
|
||||
<a href="https://leihs.app/" class="app-icon coming-soon" data-category="sharing" data-status="coming-soon" title="Equipment lending system">
|
||||
<img src="https://avatars.githubusercontent.com/u/1154614" alt="Leihs">
|
||||
<span>Leihs</span>
|
||||
</a>
|
||||
<a href="https://join-lemmy.org/" class="app-icon" data-category="social" data-status="available" title="Link aggregator for the fediverse">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/lemmy.svg" alt="Lemmy">
|
||||
<span>Lemmy</span>
|
||||
</a>
|
||||
<a href="https://librebooking.org/" class="app-icon coming-soon" data-category="sharing" data-status="coming-soon" title="Resource scheduling">
|
||||
<img src="https://avatars.githubusercontent.com/u/89961553" alt="LibreBooking">
|
||||
<span>LibreBooking</span>
|
||||
</a>
|
||||
<a href="https://www.limesurvey.org/" class="app-icon coming-soon" data-category="forms" data-status="coming-soon" title="Professional survey platform">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/limesurvey.svg" alt="LimeSurvey">
|
||||
<span>LimeSurvey</span>
|
||||
</a>
|
||||
<a href="https://liquidfeedback.com/" class="app-icon coming-soon" data-category="democracy" data-status="coming-soon" title="Liquid democracy platform">
|
||||
<img src="https://avatars.githubusercontent.com/u/3580174" alt="LiquidFeedback">
|
||||
<span>LiquidFeedback</span>
|
||||
</a>
|
||||
<a href="https://listmonk.app/" class="app-icon" data-category="crm" data-status="available" title="Newsletter manager">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/listmonk.svg" alt="Listmonk">
|
||||
<span>Listmonk</span>
|
||||
</a>
|
||||
<a href="https://www.loomio.com/" class="app-icon" data-category="democracy" data-status="available" title="Group decision-making">
|
||||
<img src="https://www.loomio.com/brand/logo_gold.svg" alt="Loomio">
|
||||
<span>Loomio</span>
|
||||
</a>
|
||||
<a href="https://mapcomplete.org/" class="app-icon coming-soon" data-category="maps" data-status="coming-soon" title="OSM themed maps">
|
||||
<img src="https://avatars.githubusercontent.com/u/66927796" alt="MapComplete">
|
||||
<span>MapComplete</span>
|
||||
</a>
|
||||
<a href="https://joinmastodon.org/" class="app-icon" data-category="social" data-status="available" title="Decentralized social network">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mastodon.svg" alt="Mastodon">
|
||||
<span>Mastodon</span>
|
||||
</a>
|
||||
<a href="https://matrix.org/" class="app-icon" data-category="social collaboration" data-status="available" title="Secure real-time messaging">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/matrix.svg" alt="Matrix">
|
||||
<span>Matrix</span>
|
||||
</a>
|
||||
<a href="https://mattermost.com/" class="app-icon coming-soon" data-category="collaboration" data-status="coming-soon" title="Self-hosted Slack alternative">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mattermost.svg" alt="Mattermost">
|
||||
<span>Mattermost</span>
|
||||
</a>
|
||||
<a href="https://www.mautic.org/" class="app-icon coming-soon" data-category="crm" data-status="coming-soon" title="Marketing automation">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mautic.svg" alt="Mautic">
|
||||
<span>Mautic</span>
|
||||
</a>
|
||||
<a href="https://www.mediawiki.org/" class="app-icon coming-soon" data-category="knowledge" data-status="coming-soon" title="Wikipedia's software">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mediawiki.svg" alt="MediaWiki">
|
||||
<span>MediaWiki</span>
|
||||
</a>
|
||||
<a href="https://www.memcached.org/" class="app-icon" data-category="infra" data-status="available" title="Distributed memory caching">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/memcached.svg" alt="Memcached">
|
||||
<span>Memcached</span>
|
||||
</a>
|
||||
<a href="https://joinmobilizon.org/" class="app-icon coming-soon" data-category="social events" data-status="coming-soon" title="Federated event organizing">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mobilizon.svg" alt="Mobilizon">
|
||||
<span>Mobilizon</span>
|
||||
</a>
|
||||
<a href="https://moodle.org/" class="app-icon coming-soon" data-category="learning" data-status="coming-soon" title="Learning management system">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/moodle.svg" alt="Moodle">
|
||||
<span>Moodle</span>
|
||||
</a>
|
||||
<a href="https://www.mysql.com/" class="app-icon" data-category="infra" data-status="available" title="Relational database">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mysql.svg" alt="MySQL">
|
||||
<span>MySQL</span>
|
||||
</a>
|
||||
<a href="https://nextcloud.com/" class="app-icon coming-soon" data-category="collaboration" data-status="coming-soon" title="Complete collaboration platform">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nextcloud.svg" alt="Nextcloud">
|
||||
<span>Nextcloud</span>
|
||||
</a>
|
||||
<a href="https://nocodb.com/" class="app-icon coming-soon" data-category="nocode" data-status="coming-soon" title="Airtable alternative">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nocodb.svg" alt="NocoDB">
|
||||
<span>NocoDB</span>
|
||||
</a>
|
||||
<a href="https://www.odoo.com/" class="app-icon coming-soon" data-category="crm" data-status="coming-soon" title="Business suite">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/odoo.svg" alt="Odoo">
|
||||
<span>Odoo</span>
|
||||
</a>
|
||||
<a href="https://ohmyform.com/" class="app-icon coming-soon" data-category="forms" data-status="coming-soon" title="Self-hosted form builder">
|
||||
<img src="https://avatars.githubusercontent.com/u/51406676" alt="OhMyForm">
|
||||
<span>OhMyForm</span>
|
||||
</a>
|
||||
<a href="https://opencollective.com/" class="app-icon coming-soon" data-category="finance coop" data-status="coming-soon" title="Transparent fundraising">
|
||||
<img src="https://avatars.githubusercontent.com/u/17980918" alt="Open Collective">
|
||||
<span>Open Collective</span>
|
||||
</a>
|
||||
<a href="https://openedx.org/" class="app-icon coming-soon" data-category="learning" data-status="coming-soon" title="Online learning at scale">
|
||||
<img src="https://avatars.githubusercontent.com/u/3170503" alt="Open edX">
|
||||
<span>Open edX</span>
|
||||
</a>
|
||||
<a href="https://openfoodnetwork.org/" class="app-icon coming-soon" data-category="coop" data-status="coming-soon" title="Local food network">
|
||||
<img src="https://avatars.githubusercontent.com/u/2291587" alt="Open Food Network">
|
||||
<span>Open Food</span>
|
||||
</a>
|
||||
<a href="https://openwebui.com/" class="app-icon" data-category="ai" data-status="available" title="ChatGPT-like interface for local LLMs">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/open-webui.svg" alt="Open WebUI">
|
||||
<span>Open WebUI</span>
|
||||
</a>
|
||||
<a href="https://www.openproject.org/" class="app-icon" data-category="projects" data-status="available" title="Project management">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/openproject.svg" alt="OpenProject">
|
||||
<span>OpenProject</span>
|
||||
</a>
|
||||
<a href="https://getoutline.com/" class="app-icon coming-soon" data-category="knowledge" data-status="coming-soon" title="Team knowledge base">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/outline.svg" alt="Outline">
|
||||
<span>Outline</span>
|
||||
</a>
|
||||
<a href="https://joinpeertube.org/" class="app-icon coming-soon" data-category="social media" data-status="coming-soon" title="Decentralized video hosting">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/peertube.svg" alt="PeerTube">
|
||||
<span>PeerTube</span>
|
||||
</a>
|
||||
<a href="https://pixelfed.org/" class="app-icon coming-soon" data-category="social media" data-status="coming-soon" title="Federated image sharing">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/pixelfed.svg" alt="Pixelfed">
|
||||
<span>Pixelfed</span>
|
||||
</a>
|
||||
<a href="https://pol.is/" class="app-icon coming-soon" data-category="democracy" data-status="coming-soon" title="AI-powered opinion gathering">
|
||||
<img src="https://avatars.githubusercontent.com/u/4134512" alt="Pol.is">
|
||||
<span>Pol.is</span>
|
||||
</a>
|
||||
<a href="https://www.postgresql.org/" class="app-icon" data-category="infra" data-status="available" title="Advanced relational database">
|
||||
<img src="https://www.postgresql.org/media/img/about/press/elephant.png" alt="PostgreSQL">
|
||||
<span>PostgreSQL</span>
|
||||
</a>
|
||||
<a href="https://pretix.eu/" class="app-icon coming-soon" data-category="events" data-status="coming-soon" title="Ticket sales & registration">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/pretix.svg" alt="Pretix">
|
||||
<span>Pretix</span>
|
||||
</a>
|
||||
<a href="https://redis.io/" class="app-icon" data-category="infra" data-status="available" title="In-memory data store">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/redis.svg" alt="Redis">
|
||||
<span>Redis</span>
|
||||
</a>
|
||||
<a href="https://resonate.coop/" class="app-icon coming-soon" data-category="coop media" data-status="coming-soon" title="Music streaming coop">
|
||||
<img src="https://avatars.githubusercontent.com/u/14469932" alt="Resonate">
|
||||
<span>Resonate</span>
|
||||
</a>
|
||||
<a href="https://rocket.chat/" class="app-icon coming-soon" data-category="collaboration" data-status="coming-soon" title="Team collaboration platform">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/rocket-chat.svg" alt="Rocket.Chat">
|
||||
<span>Rocket.Chat</span>
|
||||
</a>
|
||||
<a href="https://taiga.io/" class="app-icon coming-soon" data-category="projects" data-status="coming-soon" title="Agile project management">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/taiga.svg" alt="Taiga">
|
||||
<span>Taiga</span>
|
||||
</a>
|
||||
<a href="https://terrastories.app/" class="app-icon coming-soon" data-category="maps" data-status="coming-soon" title="Geostorytelling">
|
||||
<img src="https://avatars.githubusercontent.com/u/42573682" alt="Terrastories">
|
||||
<span>Terrastories</span>
|
||||
</a>
|
||||
<a href="https://typebot.io/" class="app-icon coming-soon" data-category="forms" data-status="coming-soon" title="Conversational form builder">
|
||||
<img src="https://avatars.githubusercontent.com/u/76883539" alt="Typebot">
|
||||
<span>Typebot</span>
|
||||
</a>
|
||||
<a href="https://umap.openstreetmap.fr/" class="app-icon coming-soon" data-category="maps" data-status="coming-soon" title="Custom maps with OSM">
|
||||
<img src="https://avatars.githubusercontent.com/u/14034779" alt="uMap">
|
||||
<span>uMap</span>
|
||||
</a>
|
||||
<a href="https://www.ushahidi.com/" class="app-icon coming-soon" data-category="maps civic" data-status="coming-soon" title="Crowdsourced mapping">
|
||||
<img src="https://avatars.githubusercontent.com/u/49912" alt="Ushahidi">
|
||||
<span>Ushahidi</span>
|
||||
</a>
|
||||
<a href="https://docs.vllm.ai/" class="app-icon" data-category="ai" data-status="available" title="High-performance LLM inference server">
|
||||
<img src="https://unpkg.com/@lobehub/icons-static-png@latest/dark/vllm.png" alt="vLLM">
|
||||
<span>vLLM</span>
|
||||
</a>
|
||||
<a href="https://wekan.github.io/" class="app-icon coming-soon" data-category="projects" data-status="coming-soon" title="Open source Kanban board">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/wekan.svg" alt="Wekan">
|
||||
<span>Wekan</span>
|
||||
</a>
|
||||
<a href="https://js.wiki/" class="app-icon coming-soon" data-category="knowledge" data-status="coming-soon" title="Modern wiki platform">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/wikijs.svg" alt="Wiki.js">
|
||||
<span>Wiki.js</span>
|
||||
</a>
|
||||
<a href="https://writefreely.org/" class="app-icon coming-soon" data-category="social publishing" data-status="coming-soon" title="Minimalist federated blogging">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/writefreely.svg" alt="WriteFreely">
|
||||
<span>WriteFreely</span>
|
||||
</a>
|
||||
<a href="https://citizens.is/" class="app-icon coming-soon" data-category="democracy" data-status="coming-soon" title="Citizen engagement platform">
|
||||
<img src="https://avatars.githubusercontent.com/u/6688058" alt="Your Priorities">
|
||||
<span>Your Priorities</span>
|
||||
</a>
|
||||
<a href="https://zulip.com/" class="app-icon coming-soon" data-category="collaboration" data-status="coming-soon" title="Threaded team chat">
|
||||
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/zulip.svg" alt="Zulip">
|
||||
<span>Zulip</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<p class="app-count"><span id="visible-count">0</span> apps shown</p>
|
||||
|
||||
<div style="text-align: center; margin-top: 1rem;">
|
||||
<a href="https://git.civilsociety.dev/wild-cloud/wild-directory" target="_blank" class="filter-btn" style="display: inline-block; text-decoration: none;">View App Directory on Gitea</a>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const filterBtns = document.querySelectorAll('.filter-btn');
|
||||
const appGrid = document.getElementById('app-grid');
|
||||
if (!appGrid) return;
|
||||
const apps = appGrid.querySelectorAll('.app-icon');
|
||||
const countEl = document.getElementById('visible-count');
|
||||
|
||||
function updateCount() {
|
||||
const visible = appGrid.querySelectorAll('.app-icon:not([style*="display: none"])').length;
|
||||
countEl.textContent = visible;
|
||||
}
|
||||
|
||||
filterBtns.forEach(btn => {
|
||||
if (!btn.dataset.filter) return;
|
||||
btn.addEventListener('click', function() {
|
||||
const filter = this.dataset.filter;
|
||||
|
||||
// Update active state
|
||||
filterBtns.forEach(b => {
|
||||
if (b.dataset.filter) b.classList.remove('active');
|
||||
});
|
||||
this.classList.add('active');
|
||||
|
||||
// Filter apps
|
||||
apps.forEach(app => {
|
||||
const category = app.dataset.category || '';
|
||||
const status = app.dataset.status || '';
|
||||
|
||||
let show = false;
|
||||
if (filter === 'all') {
|
||||
show = true;
|
||||
} else if (filter === 'available') {
|
||||
show = status === 'available';
|
||||
} else if (filter === 'coming-soon') {
|
||||
show = status === 'coming-soon';
|
||||
} else {
|
||||
show = category.includes(filter);
|
||||
}
|
||||
|
||||
app.style.display = show ? '' : 'none';
|
||||
});
|
||||
|
||||
updateCount();
|
||||
});
|
||||
});
|
||||
|
||||
// Initial count
|
||||
updateCount();
|
||||
});
|
||||
</script>
|
||||
|
||||
## Get started
|
||||
|
||||
We're in the early days of the Wild Cloud project, yet we already have two functional "Proof of concept" clouds. In fact, all Wild Cloud and CSTF sites and services are running on our PoC wild cloud. The concept works. If you are an experienced developer, you can check out the software and start building your own wild cloud. Our next milestone is to continue ironing out the software and educational materials so that we can invite early adopters to start building their own wild clouds.
|
||||
We're in the early days of the Wild Cloud project, yet we already have two functional "Proof of concept" clouds. In fact, all Wild Cloud and [CSTF](https://civilsociety.dev) sites and services are running on our PoC wild cloud. The concept works. If you are an experienced developer, you can check out the software and start building your own wild cloud. We are actively seeking active communites to pilot new wild cloud installations.
|
||||
|
||||
If you would like to get us to this next milestone, join our [developer community](https://git.civilsociety.dev/CSTF/wild-cloud).
|
||||
|
||||
If you would like to help the project move forward in other ways, check out our parent org at [Civil Society Tech Foundation](https://civilsociety.dev) and consider supporting us with a donation or connecting us with interested partners.
|
||||
If you would like to get us to this next milestone, join our [developer community](https://git.civilsociety.dev/wild-cloud/wild-cloud).
|
||||
@@ -6,17 +6,21 @@ draft = false
|
||||
|
||||
Wild Cloud is a community-driven, open source project.
|
||||
|
||||
## Ask
|
||||
|
||||
Want to get in touch with the founder and developer of Wild Cloud v1? Email paul@payne.io.
|
||||
|
||||
## Discuss
|
||||
|
||||
The [Civil Society Technology Foundation (CSTF)](https://civilsociety.dev) provides a [forum for Wild Cloud community discussion](https://forum.civilsociety.dev/c/wild-cloud/). All are welcome! It's kinda quiet there right now, but hey, if you post now you'll always be remembered as a founding contributor!
|
||||
|
||||
## Hack
|
||||
|
||||
If you're ready to jump into development, join our project at https://git.civilsociety.dev/wild-cloud. We accept community pull requests related to any of these issues.
|
||||
If you're ready to jump into development, join our project at https://git.civilsociety.dev/wild-cloud. In addition to source code, you'll find a list of our current [issues](https://git.civilsociety.dev/wild-cloud/wild-cloud/issues). We accept community pull requests related to any of these issues.
|
||||
|
||||
## Propose
|
||||
|
||||
You can propose new issues in the forum.
|
||||
You can propose new features in the [forum](https://forum.civilsociety.dev/c/wild-cloud/).
|
||||
|
||||
## Broader engagement
|
||||
|
||||
|
||||
BIN
content/get-started/flint2.jpg
Normal file
BIN
content/get-started/flint2.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 122 KiB |
@@ -3,18 +3,96 @@ title: 🌩️ Get started
|
||||
date: 2026-01-04
|
||||
---
|
||||
|
||||
## Prepare a domain name
|
||||
|
||||
Your wild cloud applications will be accessible on the internet through a domain name (like `mydomain.org`). When you install public applications on your wild cloud they will, by default, be made available on a subdomain of your domain (like `discourse.mydomain.org`).
|
||||
|
||||
If you don't already have a domain name, we recommend registering one with [Cloudflare](https://www.cloudflare.com/). Currently, Wild Cloud requires Cloudflare features for automatic management of domain configuration and security certificates. You __can__ have your domain registered with any registrar, but you will need to use Cloudflare's DNS services for your domain. This is free and easy to set up.
|
||||
|
||||
For now, just make sure you have a domain name ready and that your DNS is managed by Cloudflare. You will configure it in Wild Central later.
|
||||
|
||||
## Gather your hardware
|
||||
|
||||
To set up your wild cloud, you will need some basic hardware. Here are the minimum requirements:
|
||||
|
||||
<div class="grid grid-cols-3 gap-4">
|
||||
<div>
|
||||
{{< figure
|
||||
src="./flint2.jpg"
|
||||
title="LAN Router"
|
||||
caption="Your LAN router connects your local network to the internet."
|
||||
>}}
|
||||
</div>
|
||||
<div>
|
||||
{{< figure
|
||||
src="./switch.jpg"
|
||||
class=""
|
||||
title="A network switch"
|
||||
caption="A network switch is used to connect multiple devices on your local network."
|
||||
>}}
|
||||
</div>
|
||||
<div>
|
||||
{{< figure
|
||||
src="./wild-central.jpg"
|
||||
title="Wild Central"
|
||||
caption="Wild Central is the heart of your wild cloud, running on an inexpensive computer like a Raspberry Pi."
|
||||
>}}
|
||||
</div>
|
||||
<div>
|
||||
{{< figure
|
||||
src="./micro-pc.jpg"
|
||||
title="Inexpensive computer"
|
||||
caption="You'll need at least six additional computers (three control nodes and three worker nodes)."
|
||||
>}}
|
||||
</div>
|
||||
<div>
|
||||
{{< figure
|
||||
src="./ups.jpg"
|
||||
title="An uninterruptible power supply (UPS)"
|
||||
caption="A UPS helps keep your wild cloud running during short power outages."
|
||||
>}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
## Set up Wild Central
|
||||
|
||||
- Set up your Wild Central
|
||||
- Machine
|
||||
- Wild Central softare install
|
||||
The heart of your wild cloud is _Wild Central_, an inexpensive computer that runs on your local network that helps you set up and manage your wild cloud. Wild Central can be set up on an inexpensive computer (around $100USD), like a Raspberry Pi. My Wild Central looks like this:
|
||||
|
||||

|
||||
|
||||
Wild Central does several things for you:
|
||||
|
||||
- Helps you set up one or more wild clouds on your network.
|
||||
- Handles internal networking for your cloud. Wild Central allows computers on your network to find the internal apps deployed on your cloud.
|
||||
- Handles external networking for your cloud. Traffic will be routed from the internet, through your LAN router, to Wild Central, and then to the appropriate app on your cloud.
|
||||
- Allows you to install apps from the Wild Directory to your cloud with a few clicks.
|
||||
- Monitors the health of your cloud and notifies you if something goes wrong.
|
||||
|
||||
After you set up Wild Central, it runs on your network without a display or keyboard. You access it on your network through any web browser. Although you can install Wild Cloud on any computer, it is best to have a standalone device as Wild Central needs to be always on.
|
||||
|
||||
Setting up Wild Central:
|
||||
|
||||
- Prepare a machine for Wild Central. This can be a Raspberry Pi or any other inexpensive computer running Ubuntu Linux.
|
||||
- Download and install the Wild Central software on your machine.
|
||||
- Access Wild Central through your web browser.
|
||||
|
||||
## Set up your networking
|
||||
|
||||
Once Wild Central is set up, you need to instruct your LAN router (the device that connects your local network to the internet) to use Wild Central in two ways:
|
||||
|
||||
- Forward incoming web traffic (HTTP and HTTPS) to Wild Central. This allows external users to access the public apps deployed on your wild cloud.
|
||||
- Use Wild Central as the DNS server for your network. This allows devices on your network to find the internal apps deployed on your wild cloud.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## Set up your cloud
|
||||
|
||||

|
||||
|
||||
|
||||
- Create your Wild Cloud instance
|
||||
- Domain setup
|
||||
- Get your domain name
|
||||
- Wild Central DNS
|
||||
- Set up your control nodes
|
||||
- Set up your worker nodes
|
||||
- Install services
|
||||
|
||||
BIN
content/get-started/micro-pc.jpg
Normal file
BIN
content/get-started/micro-pc.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 91 KiB |
@@ -34,7 +34,7 @@ export PATH=$PATH:~/wild-cloud/bin
|
||||
Install dependencies:
|
||||
|
||||
```bash
|
||||
scripts/setup-utils.sh
|
||||
scripts/install-wild-cloud-dependencies.sh
|
||||
```
|
||||
|
||||
## Create your Wild Cloud Home
|
||||
@@ -50,7 +50,7 @@ You can put it in any directory. Here we show an example if you want to make a d
|
||||
```bash
|
||||
mkdir -p ~/my-wild-cloud
|
||||
cd ~/my-wild-cloud
|
||||
wild-cloud-scaffold
|
||||
wild-init
|
||||
```
|
||||
|
||||
That's it! Your wild cloud operator machine is ready to go! Most of the rest of the instructions in this guide will assume you are working within this directory.
|
||||
|
||||
@@ -17,16 +17,12 @@ You will be using a USB key to boot each of your cluster machines. Let's create
|
||||
From your wild cloud home, run:
|
||||
|
||||
```bash
|
||||
# Upload schematic configuration to get schematic ID from the Talos ISO service.
|
||||
wild-talos-schema
|
||||
|
||||
# Download custom ISO with system extensions.
|
||||
wild-cluster-node-boot-assets-download
|
||||
```
|
||||
|
||||
This will download all the Talos ISOs for your wild cloud configuration.
|
||||
This will download a Talos ISO you can use to create a USB drive.
|
||||
|
||||
The custom ISO includes system extensions needed for a wild cloud cluster and is saved to `.wildcloud/iso/talos-v<VERSION>-metal-amd64.iso`.
|
||||
The custom ISO includes system extensions needed for a wild cloud cluster and is saved to `.wildcloud/node-boot-assets/<schematicId>/iso/talos-v<VERSION>-metal-amd64.iso`.
|
||||
|
||||
|
||||
### Copy ISO to a USB drive
|
||||
@@ -45,8 +41,9 @@ sync
|
||||
|
||||
**⚠️ Warning**: Double-check the device path (`/dev/sdX`). Writing to the wrong device will destroy data!
|
||||
|
||||
TO DO: Look into some utilities (Balena Etcher, Rufus, etc.) to make this simpler/safer.
|
||||
|
||||
{{< go-deeper >}}
|
||||
Note: Balena Etcher can also be used to create a bootable USB drive from the ISO.
|
||||
{{< /go-deeper >}}
|
||||
|
||||
## How to install Talos OS on a machine
|
||||
|
||||
@@ -107,7 +104,7 @@ wild-setup-services
|
||||
When the setup is finished, you can test your installation with:
|
||||
|
||||
```bash
|
||||
wild-status
|
||||
wild-health
|
||||
```
|
||||
|
||||
## Next Steps
|
||||
|
||||
BIN
content/get-started/switch.jpg
Normal file
BIN
content/get-started/switch.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 50 KiB |
BIN
content/get-started/ups.jpg
Normal file
BIN
content/get-started/ups.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 138 KiB |
BIN
content/get-started/wild-central.jpg
Normal file
BIN
content/get-started/wild-central.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 144 KiB |
@@ -5,257 +5,105 @@ featureImageCaption: Author unknown. (https://commons.wikimedia.org/wiki/File:Li
|
||||
summary: "Git is more than just a version control system; it embodies principles of decentralization, resilience, and user self-determination. This article explores how Git's distributed architecture aligns with the values of civil society organizations, enabling them to maintain control over their digital infrastructure."
|
||||
---
|
||||
|
||||
## Introduction
|
||||
## Git: The Version Control Superpower
|
||||
|
||||
Version control systems are the backbone of modern software development, enabling collaboration, preserving history, and managing complexity. Among these tools, Git stands apart—not just as the most widely used version control system, but as a technology that fundamentally aligns with principles of decentralization, resilience, and user self-determination.
|
||||
Most of us have, at some point, saved a file as `project.doc`, then later as `project-final.doc`, then finally as `project-final-final2.doc`. 😅 That mess is what Git was created to solve. Git is a **version control system**—a tool that lets you track every change to your files, collaborate safely with others, and rewind history if something goes wrong.
|
||||
|
||||
For civil society organizations, Git represents much more than a development tool. It embodies a different way of thinking about collaboration—one based on distributed trust, transparent history, and resilience against centralized control. In this article, we explore what Git is, how it works, and why its approach to distributed collaboration matters for organizations committed to digital self-determination.
|
||||
{{<definition>}}
|
||||
**Version Control System (VCS)**: Software that records changes to files over time so you can recall specific versions later. It allows multiple people to work on the same files without overwriting each other’s work.
|
||||
{{</definition>}}
|
||||
|
||||
## What Is Git?
|
||||
---
|
||||
|
||||
Git is a distributed version control system created by Linus Torvalds (the original developer of Linux) in 2005. Unlike previous version control systems that relied on centralized servers, Git gives every participant a complete copy of the project's entire history. This seemingly simple architectural choice has profound implications for how collaboration works.
|
||||
## A little backstory
|
||||
|
||||
### Key Characteristics of Git
|
||||
In 2005, Linus Torvalds (the creator of Linux) needed a better way for thousands of people all over the world to contribute code to the Linux kernel without stepping on each other’s toes. He wrote Git in a few weeks, and it became the backbone of modern software development. Today, Git powers not just Linux, but nearly every open-source project, GitHub, GitLab, and the tools you’ll use in your Wild Cloud journey.
|
||||
|
||||
- **Distributed**: Every repository contains the full history, enabling offline work and eliminating single points of failure
|
||||
- **Content-addressed**: Files are identified by cryptographic hashes of their content, ensuring integrity
|
||||
- **Branching-focused**: Multiple lines of development can proceed in parallel, merging when ready
|
||||
- **History-preserving**: Changes are recorded as an immutable chain, creating transparency and accountability
|
||||
- **Non-hierarchical**: Any repository can synchronize with any other, without requiring a central authority
|
||||
{{<go-deeper>}}
|
||||
Want to see how radical Git was at the time? Check out Linus’s announcement on the [Linux Kernel mailing list](https://lwn.net/Articles/130681/). His blunt, hackerish style makes it clear he was building this tool to scratch a serious itch.
|
||||
{{</go-deeper>}}
|
||||
|
||||
These characteristics create a system where collaboration is possible without requiring trust in a central authority—a principle that resonates deeply with civil society's need for resilient, independent systems.
|
||||
---
|
||||
|
||||
### How Git Differs from Centralized Systems
|
||||
## Why Git matters for you
|
||||
|
||||
To understand Git's significance, it helps to contrast it with centralized approaches:
|
||||
Even if you’re not a professional software developer, Git is a huge enabler. It means:
|
||||
|
||||
| Aspect | Centralized Version Control | Git (Distributed Version Control) |
|
||||
| ----------------------- | ---------------------------- | ---------------------------------- |
|
||||
| **Network Requirement** | Constant connection needed | Can work offline with full history |
|
||||
| **Failure Points** | Central server is critical | Multiple complete copies exist |
|
||||
| **Control** | Administrator manages access | Each user controls their copy |
|
||||
| **Workflow** | Linear and prescribed | Flexible and adaptable |
|
||||
| **Trust Model** | Trust in central authority | Trust distributed across network |
|
||||
* Every change you make is recorded (and reversible).
|
||||
* You can experiment in a “branch” without breaking your main project.
|
||||
* Collaborating with friends or colleagues is safe and trackable.
|
||||
* Your entire history can be backed up anywhere (including in your wild cloud).
|
||||
|
||||
This shift from centralized to distributed architecture mirrors many of the broader transitions civil society organizations seek in digital infrastructure—moving from single points of control to resilient networks of peers.
|
||||
{{<bring-it-home>}}
|
||||
When you’re running Wild Cloud, you’ll use Git to fetch software, manage your configurations, and share your work with the community. It’s the glue that holds your setup scripts together.
|
||||
{{</bring-it-home>}}
|
||||
|
||||
## Technical Foundations
|
||||
---
|
||||
|
||||
Understanding Git's technical approach helps clarify why it's so valuable for sovereign technology practices.
|
||||
## Getting started with Git
|
||||
|
||||
### The Object Model
|
||||
### Install Git
|
||||
|
||||
At its core, Git stores four types of objects:
|
||||
On Ubuntu or Debian:
|
||||
|
||||
1. **Blobs**: The content of files
|
||||
2. **Trees**: Directories of blobs and other trees
|
||||
3. **Commits**: Snapshots of the repository at a point in time
|
||||
4. **Tags**: Named references to specific commits
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install git
|
||||
```
|
||||
|
||||
These objects form a content-addressed database where each object is identified by its SHA-1 hash. This cryptographic approach ensures:
|
||||
On macOS (with Homebrew):
|
||||
|
||||
- Content integrity (changes are immediately detectable)
|
||||
- Deduplication (identical content is stored only once)
|
||||
- Authentication (commits can be cryptographically signed)
|
||||
- Verification (history cannot be silently altered)
|
||||
```bash
|
||||
brew install git
|
||||
```
|
||||
|
||||
### The Distributed Model
|
||||
Verify the install:
|
||||
|
||||
Git's distributed nature means:
|
||||
```bash
|
||||
git --version
|
||||
```
|
||||
|
||||
- Each repository contains all objects and history
|
||||
- No single repository has special status
|
||||
- Changes are exchanged between peers through "remotes"
|
||||
- Any repository can serve as a backup for the entire project
|
||||
### Configure Git
|
||||
|
||||
This architecture creates resilience through redundancy—exactly the quality that civil society organizations need in potentially challenging environments.
|
||||
Set your identity:
|
||||
|
||||
## Git for Civil Society
|
||||
```bash
|
||||
git config --global user.name "Your Name"
|
||||
git config --global user.email "you@example.com"
|
||||
```
|
||||
|
||||
For civil society organizations, Git offers specific benefits that align with core values and practical needs:
|
||||
### Make your first repo
|
||||
|
||||
### 1. Resilience Against Disruption
|
||||
```bash
|
||||
mkdir my-first-git
|
||||
cd my-first-git
|
||||
git init
|
||||
```
|
||||
|
||||
Git's distributed nature means:
|
||||
Add a file:
|
||||
|
||||
- Work continues even if internet connectivity is limited or monitored
|
||||
- No single point of failure can eliminate access to code or documents
|
||||
- Information can be shared through multiple channels when needed
|
||||
- Organizations can maintain control of their projects regardless of hosting platform decisions
|
||||
```bash
|
||||
echo "Hello Wild Cloud" > readme.txt
|
||||
git add readme.txt
|
||||
git commit -m "Add first file"
|
||||
```
|
||||
|
||||
In contexts where infrastructure may be unreliable or subject to interference, this resilience is invaluable.
|
||||
That’s it! You’ve captured your first snapshot of history. 🎉
|
||||
|
||||
### 2. Self-Determination and Control
|
||||
---
|
||||
|
||||
Git provides complete control over:
|
||||
## ⚠️ Warning
|
||||
|
||||
- Where and how repositories are hosted
|
||||
- Who has access to what parts of the codebase
|
||||
- How contributions are reviewed and incorporated
|
||||
- What external dependencies are included
|
||||
Git is powerful but unforgiving: commands like `git reset --hard` can **destroy uncommitted work** permanently. Always double-check before running destructive commands.
|
||||
|
||||
This self-determination means organizations aren't dependent on the policies or availability of any particular service provider.
|
||||
---
|
||||
|
||||
### 3. Transparency and Accountability
|
||||
## Next Steps
|
||||
|
||||
Git's immutable history creates:
|
||||
* Try editing `readme.txt`, then running `git diff` to see your changes.
|
||||
* Explore branching with `git checkout -b new-idea`.
|
||||
* Back up your repo by pushing to [GitHub](https://github.com/) or hosting your own Git server in your wild cloud.
|
||||
|
||||
- Clear attribution of changes to specific contributors
|
||||
- Permanent record of development decisions
|
||||
- Ability to audit exactly when and how code evolved
|
||||
- Cryptographic verification of who made what changes
|
||||
---
|
||||
|
||||
These transparency features support organizational accountability and help build trust in critical systems.
|
||||
|
||||
### 4. Collaborative Without Centralization
|
||||
|
||||
Git enables collaboration models that:
|
||||
|
||||
- Don't require hierarchical permissions
|
||||
- Allow multiple approaches to develop in parallel
|
||||
- Support both tight coordination and loose federation
|
||||
- Function across organizational boundaries
|
||||
|
||||
This flexibility accommodates diverse organizational structures and coalition-building.
|
||||
|
||||
### 5. Future-Proof Documentation
|
||||
|
||||
Git repositories provide:
|
||||
|
||||
- Complete historical context for decisions
|
||||
- Self-contained documentation that travels with the code
|
||||
- Independence from any particular documentation platform
|
||||
- Resilience against link rot and lost references
|
||||
|
||||
Organizations investing in long-term projects benefit from this comprehensive approach to institutional memory.
|
||||
|
||||
## Beyond Code: Git for Documents and Data
|
||||
|
||||
While initially designed for source code, Git has proven valuable for many other content types:
|
||||
|
||||
### Documents and Publications
|
||||
|
||||
Many organizations use Git for:
|
||||
|
||||
- Policy documents with transparent revision history
|
||||
- Collaborative writing with clear attribution
|
||||
- Website content with staging and review
|
||||
- Reports that show how analysis evolved
|
||||
|
||||
Tools like Markdown, Asciidoc, and LaTeX work particularly well with Git, allowing documents to benefit from the same workflows as code.
|
||||
|
||||
### Data and Research
|
||||
|
||||
Git can manage:
|
||||
|
||||
- Datasets with clear provenance tracking
|
||||
- Analysis scripts alongside their data
|
||||
- Research findings with reproducible methods
|
||||
- Configuration files with documented changes
|
||||
|
||||
While large binary files require special handling, Git-LFS (Large File Storage) extends Git's capabilities to manage these efficiently.
|
||||
|
||||
### Infrastructure as Code
|
||||
|
||||
Git is essential for:
|
||||
|
||||
- Server configurations that can be tested and rolled back
|
||||
- Network setups with documented changes
|
||||
- Deployment scripts with security reviews
|
||||
- Container definitions with audit trails
|
||||
|
||||
This "infrastructure as code" approach lets organizations apply the same governance to their infrastructure that they apply to their software.
|
||||
|
||||
## Common Git Workflows for Civil Society
|
||||
|
||||
Organizations can adapt Git workflows to match their needs and structures:
|
||||
|
||||
### Lightweight Personal Projects
|
||||
|
||||
For individual work or small teams:
|
||||
|
||||
- Simple branching strategy (main branch with feature branches)
|
||||
- Direct pushes for trusted contributors
|
||||
- Minimal process overhead
|
||||
- Local repositories with occasional synchronization
|
||||
|
||||
### Collaborative Open Projects
|
||||
|
||||
For community projects with multiple contributors:
|
||||
|
||||
- Fork and pull request model
|
||||
- Review requirements for all changes
|
||||
- Issue tracking integrated with development
|
||||
- Public repositories on platforms like GitHub, GitLab, or self-hosted Gitea
|
||||
|
||||
### Secure Sensitive Projects
|
||||
|
||||
For projects handling sensitive information:
|
||||
|
||||
- Careful access control with signed commits
|
||||
- Self-hosted repositories with controlled access
|
||||
- Encrypted storage of sensitive configuration
|
||||
- Clear separation between public and private components
|
||||
|
||||
## Misconceptions About Git
|
||||
|
||||
Several misconceptions can discourage adoption:
|
||||
|
||||
### "Git Is Only for Programmers"
|
||||
|
||||
**Reality**: While Git emerged from software development, its principles apply to any collaborative work that benefits from version history. Many non-technical teams use Git for documentation, policy development, and publishing workflows.
|
||||
|
||||
### "Git Is Too Complicated"
|
||||
|
||||
**Reality**: Git's power does come with complexity, but:
|
||||
|
||||
- Basic workflows require learning only a few commands
|
||||
- Graphical interfaces make common operations accessible
|
||||
- The learning curve reflects Git's power and flexibility
|
||||
- Skills developed transfer across projects and organizations
|
||||
|
||||
### "We Need a Central Server Anyway"
|
||||
|
||||
**Reality**: While many organizations use platforms like GitHub or GitLab, these are conveniences, not requirements. Git can function entirely via email, USB drives, or direct connections when needed, and any Git repository can serve as a temporary "hub" when appropriate.
|
||||
|
||||
## Getting Started with Git
|
||||
|
||||
For civil society organizations exploring Git, we recommend:
|
||||
|
||||
1. **Start small**: Use Git for a defined project with clear boundaries
|
||||
2. **Focus on fundamentals**: Learn core concepts rather than memorizing commands
|
||||
3. **Choose appropriate tools**: Use graphical interfaces when they help
|
||||
4. **Create conventions**: Establish clear norms for commit messages and branching
|
||||
5. **Build skills gradually**: Add more advanced workflows as teams become comfortable
|
||||
|
||||
The Civil Society Technology Foundation can provide guidance on Git adoption strategies tailored to organizational needs and constraints.
|
||||
|
||||
## Beyond Git: The Distributed Collaboration Ecosystem
|
||||
|
||||
Git has inspired a broader ecosystem of tools supporting distributed, sovereign approaches:
|
||||
|
||||
- **Decentralized forges** like Radicle provide Git collaboration without central servers
|
||||
- **Offline-first tools** extend Git's model to other content types
|
||||
- **Peer-to-peer synchronization** enables collaboration without central infrastructure
|
||||
- **Signed commits** provide strong attribution even in untrusted environments
|
||||
|
||||
These innovations continue to expand Git's relevance for civil society's digital infrastructure.
|
||||
|
||||
## Case Study: Resilient Documentation in Challenging Environments
|
||||
|
||||
Organizations working in regions with internet censorship or surveillance have used Git to:
|
||||
|
||||
- Maintain critical documentation despite platform blocks
|
||||
- Share information through multiple channels when primary methods are restricted
|
||||
- Preserve historical records that might otherwise be vulnerable to tampering
|
||||
- Collaborate across geographical and technical boundaries
|
||||
|
||||
By distributing repositories across multiple participants, these organizations ensure their work continues regardless of external pressures.
|
||||
|
||||
## Conclusion
|
||||
|
||||
Git represents more than just a tool—it embodies an approach to collaboration built on principles that civil society defends: distributed authority, transparent history, resilient systems, and user self-determination. By adopting Git and its associated practices, organizations don't just improve their technical workflows; they align their operational methods with their values.
|
||||
|
||||
The Civil Society Technology Foundation recognizes Git as a foundational technology for independent civil society infrastructure, enabling transparent collaboration without creating new dependencies or vulnerabilities.
|
||||
|
||||
In a digital landscape increasingly dominated by centralized platforms and services, Git offers a tested, proven approach to collaboration that maintains independence, builds institutional memory, and creates resilience against disruption—not as a technical preference, but as an expression of civil society's core principles in code.
|
||||
👉 So, Git isn’t just for coders—it’s for anyone who wants to keep control of their digital work. Once you start using it, you may wonder how you ever kept track of files without it.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{{ define "main" }}
|
||||
<article class="h-full max-w-full flex flex-col items-center justify-center text-center">
|
||||
<article class="h-full max-w-full flex flex-col">
|
||||
<header>
|
||||
{{ if .Params.showBreadcrumbs | default (.Site.Params.article.showBreadcrumbs | default false) }}
|
||||
{{ partial "breadcrumbs.html" . }}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<article class="h-full max-w-full flex flex-col items-center justify-center text-center prose dark:prose-invert">
|
||||
<article class="h-full max-w-full flex flex-col items-center justify-center prose dark:prose-invert">
|
||||
<section class="mt-6 prose dark:prose-invert">{{ .Content }}</section>
|
||||
</article>
|
||||
<section>
|
||||
|
||||
33
layouts/partials/series/series_base.html
Normal file
33
layouts/partials/series/series_base.html
Normal file
@@ -0,0 +1,33 @@
|
||||
{{ if .Params.series }}
|
||||
<summary
|
||||
class="py-1 text-lg font-semibold cursor-pointer bg-primary-200 text-neutral-800 ltr:-ml-5 ltr:pl-5 rtl:-mr-5 rtl:pr-5 dark:bg-primary-800 dark:text-neutral-100">
|
||||
{{ index .Params.series 0 }} -
|
||||
{{ i18n "article.part_of_series" }}
|
||||
</summary>
|
||||
{{ $seriesName := index .Params.series 0 }}
|
||||
{{ $allPages := .Site.AllPages }}
|
||||
{{ $seriesPages := slice }}
|
||||
{{ range $allPages }}
|
||||
{{ if and .Params.series (eq (index .Params.series 0) $seriesName) (isset .Params "series_order") }}
|
||||
{{ $seriesPages = $seriesPages | append . }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ $sortedPages := sort $seriesPages "Params.series_order" }}
|
||||
{{ range $post := $sortedPages }}
|
||||
{{ if eq $post.Permalink $.Page.Permalink }}
|
||||
<div
|
||||
class="py-1 border-dotted border-neutral-300 ltr:-ml-5 ltr:border-l ltr:pl-5 rtl:-mr-5 rtl:border-r rtl:pr-5 dark:border-neutral-600">
|
||||
{{ i18n "article.part" }} {{ $post.Params.series_order }}:
|
||||
{{ i18n "article.this_article" }}
|
||||
</div>
|
||||
{{ else }}
|
||||
<div
|
||||
class="py-1 border-dotted border-neutral-300 ltr:-ml-5 ltr:border-l ltr:pl-5 rtl:-mr-5 rtl:border-r rtl:pr-5 dark:border-neutral-600">
|
||||
<a href="{{ $post.RelPermalink }}">
|
||||
{{ i18n "article.part" }} {{ $post.Params.series_order }}:
|
||||
{{ $post.Params.title }}
|
||||
</a>
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
@@ -3,4 +3,4 @@
|
||||
hugo build
|
||||
docker build -t payneio/mywildcloud.org . --file ./Dockerfile
|
||||
docker push payneio/mywildcloud.org
|
||||
kubectl rollout restart deployment mywildcloud -n mywildcloud
|
||||
KUBECONFIG=~/.kube/config kubectl rollout restart deployment mywildcloud -n mywildcloud
|
||||
|
||||
Reference in New Issue
Block a user