Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion content/en/.gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# Imported
community.md
contributing.md
governance.md
security.md
59 changes: 59 additions & 0 deletions content/en/community.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
---
title: "Community"
description: "Meet the Cozystack community — chat channels, the community meeting, and how to start contributing."
date: 2026-08-03T12:00:00+05:00
draft: false
type: "page"
weight: 20
---

# Community

Cozystack is a CNCF project built in the open. Everything below is public and open to anyone — you do not need to be a contributor, a customer, or an expert.

## Talk to us

| Where | What it is for |
|---|---|
| [Telegram — English](https://t.me/cozystack) | Day-to-day questions, the fastest place to get an answer |
| [Telegram — Russian](https://t.me/cozystack_ru) | Same, in Russian |
| [CNCF Slack — #cozystack](https://cloud-native.slack.com/archives/C08BQJD95J7) | Discussion inside the CNCF workspace |
| [Kubernetes Slack — #cozystack](https://kubernetes.slack.com/archives/C06L3CPRVN1) | Discussion inside the Kubernetes workspace ([get an invite](https://slack.kubernetes.io/)) |
| [GitHub Discussions](https://github.com/cozystack/cozystack/discussions) | Usage questions and early ideas worth keeping |
| [cncf-cozystack-dev mailing list](https://lists.cncf.io/g/cncf-cozystack-dev) | Announcements, and edit access to the meeting notes |

## Community meeting

The community meeting runs **every second Thursday at 18:00 CET** and is open to everyone. Releases, design proposals and open questions are discussed there, and new attendees are invited to introduce themselves at the start.
Comment on lines +25 to +27

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== locate relevant files ==="
git ls-files | rg '(^|/)content/en/community\.md$|layouts/shortcodes/home/calendar\.html$|^config|archetypes|themes' | sed -n '1,120p'

echo
echo "=== community.md excerpt ==="
if [ -f content/en/community.md ]; then
  nl -ba content/en/community.md | sed -n '1,70p'
fi

echo
echo "=== calendar.html excerpt ==="
if [ -f layouts/shortcodes/home/calendar.html ]; then
  nl -ba layouts/shortcodes/home/calendar.html | sed -n '1,90p'
fi

echo
echo "=== search for /community/#meetings and heading id variants ==="
rg -n 'community/#meetings|id=["'\'']meetings|/community/|community meeting|<a |anchor|slug|title:' layout layouts content -S || true

Repository: cozystack/website

Length of output: 346


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== community.md excerpt ==="
if [ -f content/en/community.md ]; then
  awk '{printf "%5d\t%s\n", NR, $0}' content/en/community.md | sed -n '51,75l'
fi

echo
echo "=== calendar.html excerpt ==="
if [ -f layouts/shortcodes/home/calendar.html ]; then
  awk '{printf "%5d\t%s\n", NR, $0}' layouts/shortcodes/home/calendar.html | sed -n '25,40l'
fi

echo
echo "=== search for homepage calendar anchor and community page anchors/headings ==="
rg -n 'community/#meetings|href=.*community|id=["'\'']meetings|community meeting|<h[1-6]id|id=' layouts content -S || true

Repository: cozystack/website

Length of output: 50373


🌐 Web query:

Hugo Goldmark anchors heading IDs replace spaces with hyphens lowercase

💡 Result:

Hugo, which uses the Goldmark Markdown parser by default, automatically generates heading IDs by converting heading text into a "slug" [1]. This process typically involves lowercasing the text, stripping punctuation, and replacing spaces with hyphens [1][2][3]. In Goldmark, the exact behavior of this ID generation is controlled by the parser.autoIDType configuration setting [4][5]. The default behavior matches GitHub's slugification algorithm [1][6][5]. Key configuration details: The autoHeadingID setting must be true (which is the default) to enable automatic ID generation [4][7][6]. The autoIDType setting determines the strategy used [4][5]. The available options include: github: The default, which produces GitHub-compatible ID attributes [4][6][5]. github-ascii: Similar to github, but drops any non-ASCII characters after accent normalization [5]. blackfriday: Mimics the behavior of the older Blackfriday renderer [5]. Since version 0.60.0, Goldmark has been the default parser in Hugo [8][1]. While earlier versions (using Blackfriday) handled punctuation and spaces differently, the current Goldmark-based system focuses on GitHub compatibility, where spaces are replaced by hyphens and most punctuation is stripped [8][1][2]. If you encounter issues with trailing dashes or unexpected formatting, it is often due to trailing spaces or specific punctuation in the source heading text, which Hugo's developers have addressed in various updates to ensure cleaner slug generation [9].

Citations:


Define the meetings anchor used by the homepage.

layouts/shortcodes/home/calendar.html links to /community/#meetings, but content/en/community.md uses ## Community meeting, which generates community-meeting. Add a hidden meetings anchor before the heading or update the link to the generated heading ID.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@content/en/community.md` around lines 25 - 27, Update the Community meeting
section in the community content to expose the meetings anchor expected by the
homepage, either by adding a hidden meetings anchor before the heading or by
changing the homepage link to target the generated community-meeting ID; keep
the existing section heading and link behavior consistent.


- [Join on Zoom](https://zoom-lfx.platform.linuxfoundation.org/meeting/93845795591?password=a263fc60-ea72-41c8-84c8-a00d683ecee5)
- [Subscribe to the meetings calendar](https://calendar.google.com/calendar?cid=ZTQzZDIxZTVjOWI0NWE5NWYyOGM1ZDY0OWMyY2IxZTFmNDMzZTJlNjUzYjU2ZGJiZGE3NGNhMzA2ZjBkMGY2OEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t)
- [How the meeting runs and how to add a topic](https://github.com/cozystack/community/blob/main/community_meeting.md)
- [Archive of past meetings](https://github.com/cozystack/community/blob/main/meetings/README.md) — every meeting since April 2024, with topics and recordings

## Contribute

Contributions are not only code — documentation, testing, triage, answering questions and running events all count.

- [Contributor onboarding](https://github.com/cozystack/community/blob/main/contributors/README.md) — how to pick a task, what environment you actually need, and how to get a first pull request merged
- [Good first issues](https://github.com/cozystack/cozystack/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)
- [Developer Guide]({{% ref "/docs/v1.6/development" %}}) — how the platform is put together
- [Design proposals](https://github.com/cozystack/community/tree/main/design-proposals) — for architectural and cross-cutting changes
- [Contributor Ladder](https://github.com/cozystack/cozystack/blob/main/CONTRIBUTOR_LADDER.md) — the roles in the project and how to grow into them

## Governance

- [GOVERNANCE.md](https://github.com/cozystack/cozystack/blob/main/GOVERNANCE.md) — how decisions are made
- [MAINTAINERS.md](https://github.com/cozystack/cozystack/blob/main/MAINTAINERS.md) — who maintains what
- [ADOPTERS.md](https://github.com/cozystack/cozystack/blob/main/ADOPTERS.md) — organizations running Cozystack; add yourself
- [SECURITY.md](https://github.com/cozystack/cozystack/blob/main/SECURITY.md) — how to report a vulnerability
- [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/main/code-of-conduct.md) — which we follow

## Watch

| Playlist | What it is |
|---|---|
| [Community meetings](https://www.youtube.com/playlist?list=PLEIgpkcPkMHaXqndo8iMMLS64p4sBkHPg) | Every recorded meeting since April 2024 |
| [CozySummit Virtual 2026](https://www.youtube.com/playlist?list=PLj6h78yzYM2OaFRU_tk-9zT62p3aSvu8W) | The 2026 online summit, on the CNCF channel |
| [CozySummit'25 Virtual](https://www.youtube.com/playlist?list=PLEIgpkcPkMHZhS0thzOsjKsRf-omGlpbD) | The 2025 online summit |
| [CNCF webinars](https://www.youtube.com/playlist?list=PLEIgpkcPkMHZQ68oqHkfydnANW6qVgQSQ) | Cozystack webinars run with the CNCF |
3 changes: 3 additions & 0 deletions hugo.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,9 @@ menus:
url: /oss-health/oss-insight/
parent: oss-health
weight: 4
- name: Community
url: /community/
weight: 30
Comment on lines +325 to +327

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

fd -t f 'community\.md$' content
rg -n 'url: /community/|relLangURL' hugo.yaml layouts/partials/navbar.html

Repository: cozystack/website

Length of output: 582


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== hugo.yaml language/menu/version config =="
sed -n '1,80p' hugo.yaml
sed -n '300,340p' hugo.yaml

echo
echo "== layouts/partials/navbar.html relevant section =="
sed -n '40,75p' layouts/partials/navbar.html

echo
echo "== content tree summary =="
find content -maxdir 3 -type f | sort | sed 's#^./##' | head -120

echo
echo "== site configuration references =="
rg -n 'DefaultContentLanguage|languages:|baseURL|params:|paramsVersions|Community|community' hugo.yaml config.toml config.yaml config/_default 2>/dev/null || true

echo
echo "== community page front matter =="
sed -n '1,160p' content/en/community.md

Repository: cozystack/website

Length of output: 5839


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== content tree summary =="
find content -maxdepth 3 -type f | sort | sed 's#^./##' | head -200

echo
echo "== i18n translation keys =="
find i18n -maxdepth 3 -type f -print | sort
for f in $(find i18n -maxdepth 3 -type f -print | sort); do
  echo "--- $f"
  sed -n '1,80p' "$f"
done

echo
echo "== all content/community references =="
rg -n '^---$|content/community|community\.md|community|Community' content i18n hugo.yaml -S

Repository: cozystack/website

Length of output: 50374


🌐 Web query:

HUGO documentation relLangURL menu item URL no corresponding page translated content

💡 Result:

In Hugo, using relLangURL on menu item URLs can lead to broken links or incorrect language prefixes when the target page does not exist in the current language [1][2]. Hugo functions like relLangURL or absLangURL are designed to prepend the language prefix to a path regardless of whether a translated version of that specific page exists [3][1]. To handle menu links that should only point to translated content or fall back gracefully, consider the following best practices: 1. Use pageRef: If you define your menu entries in your site configuration, use pageRef instead of url [1]. Page references automatically resolve to the correct, language-relative path based on the available content, avoiding the manual need for relLangURL [1]. 2. Conditional Template Logic: If you must manage these links manually or use custom logic, you can check for the page's existence before rendering the link [1][2]. For instance, you can use.Site.GetPage to verify if the page exists for the current language context [1][2]. Example logic for templates: {{ with.Page }} {{.RelPermalink }} {{ else }} {{.URL | relLangURL }} {{ end }} By leveraging the.Page object associated with the menu entry (if available), you ensure that Hugo provides the specific URL for that page in the current language context, rather than blindly prepending a language prefix to a static string [1]. Avoid applying relLangURL to URLs that already contain language-specific paths or are derived from existing page objects, as this often leads to double-prefixing or incorrect routing [1][4].

Citations:


Keep the Community menu link limited to English.

content/en/community.md is the only source page, and layouts/partials/navbar.html renders the community menu item through .URL | relLangURL. This can add locale prefixes on non-English sites when no translated community.md exists. Use a translation-aware menu expression for this link, keep it English-only until translations exist, or add English fallback handling.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@hugo.yaml` around lines 325 - 327, Update the Community menu entry in the
Hugo menu configuration so it remains English-only when no translated community
page exists, avoiding locale-prefixed URLs generated through relLangURL on
non-English sites. Use the project’s translation-aware menu expression or
English fallback handling while preserving the existing Community label and
weight.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== hugo.yaml relevant sections =="
python3 - <<'PY'
from pathlib import Path
p=Path('hugo.yaml')
text=p.read_text()
for i,line in enumerate(text.splitlines(),1):
    if 'menu:' in line or (300 <= i <= 340):
        print(f"{i:4}: {line}")
PY

echo
echo "== locate navbar and search Community/Blog menu entries =="
rg -n "Community|Blog|relLangURL|i18n|languages|sectionName|weight:" hugo.yaml layouts .github 2>/dev/null | head -200

echo
echo "== git diff stat and summary for hugo.yaml =="
git diff --stat -- hugo.yaml || true
git diff --unified=80 -- hugo.yaml || true

Repository: cozystack/website

Length of output: 4307


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Hugo-related config files =="
git ls-files | rg '(^|/)(hugo\.toml|hugo\.yaml|hugo\.toml\.base\.yaml|hugo\.base\.yaml|hugo\.toml\.example|hugo\.example\.yaml)$|(^|/)hugo\.config.*' || true

echo
echo "== Search all git-tracked config for Blog menu ==
rg -n "name:\s*Blog|identifier:\s*blog|/blog|weight: 30|Community" . --glob '!node_modules/**' --glob '!dist/**' --glob '!build/**' | head -200

Repository: cozystack/website

Length of output: 314


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Search all git-tracked config for Blog menu =="
rg -n "name:\s*Blog|identifier:\s*blog|/blog|weight: 30|Community" . --glob '!node_modules/**' --glob '!dist/**' --glob '!build/**' | head -250

echo
echo "== Hugo config file sizes =="
wc -l hugo.yaml config/production/hugo.yaml .github/workflows/hugo.yaml 2>/dev/null || true

echo
echo "== hugo.yaml menu/head sections summary =="
python3 - <<'PY'
from pathlib import Path
for p in ['hugo.yaml','config/production/hugo.yaml','.github/workflows/hugo.yaml']:
    pp=Path(p)
    print(f"\n--- {p} exists={pp.exists()} ---")
    if not pp.exists(): continue
    for i,line in enumerate(pp.read_text().splitlines(),1):
        if 1 <= i <= 180 or 'menu:' in line or 'sectionName' in line or i>250:
            if ('sectionName' in line or 'url:' in line or 'name:' in line or 'weight:' in line or i<10 or i>280) in line:
                print(f"{i:4}: {line}")
PY

echo
echo "== Static files matching community/blog =="
git ls-files | rg '(^|/)(content/i18n|content|archetypes)/.*\.(md|json|toml|yaml)$|(^|/)layouts/partials/navbar\.html$' | xargs -r rg -n "Community|Blog|sectionName|/community|/blog|url:|weight:" 2>/dev/null | head -250

Repository: cozystack/website

Length of output: 41857


🌐 Web query:

Hugo menu entry duplicate weights tie-breaker order

💡 Result:

In Hugo, when menu entries share the same weight, the default sorting mechanism uses a specific tie-breaker sequence [1][2]. The menu entries are sorted by weight, then by name, and finally by identifier [1][2]. The precise logic implemented in Hugo's core is as follows [2]: 1. Weight: Entries are sorted by their defined weight value (ascending) [1][2]. 2. Name: If the weights are equal, entries are sorted by their Name (alphabetically) [1][2]. 3. Identifier: If both the weights and names are equal, entries are sorted by their Identifier (alphabetically) [1][2]. This order is standard for the default.ByWeight method [1]. If you need to avoid specific conflicts or force a particular order, ensure that your menu entries have unique identifiers assigned, as the identifier acts as the final tie-breaker [1][3][4]. Using an identifier is also required when multiple entries share the same name [1][3][5].

Citations:


🌐 Web query:

GitHub gohugoio/hugo menu.go byWeight Weight Name Identifier sort logic

💡 Result:

In Hugo, the default sort logic for menu entries—implemented in navigation/menu.go—prioritizes weight, then name, and finally the identifier [1][2][3]. The sorting is handled by the defaultMenuEntrySort function, which dictates the order in which menu entries appear when using the ByWeight method [1]. The logic is defined as follows: 1. Weight: Hugo first compares the Weight of two entries [1][4]. - If one entry has a Weight of 0 and the other does not, the entry with the non-zero Weight is prioritized (meaning it floats to the top if it is a lower positive integer, while 0-weighted items are treated as heavier/lower priority in this specific comparison logic) [1]. - If both have the same Weight, the sort proceeds to the next criteria [1]. 2. Name: If the Weights are equal, the entries are compared by their Name property using string comparison [1][4]. 3. Identifier: If both the Weight and Name are identical, the entries are finally sorted by their Identifier [1][2]. This stable sort ensures a predictable menu structure [1][4]. The Identifier is used as a fallback tie-breaker when Name is not sufficient to distinguish entries, which is particularly relevant when multiple menu items share the same display name [2][5].

Citations:


Use a unique menu weight for Community.

Community uses weight 30, which is also used by the Blog section front matter. Hugo falls back on the entry name when weights match, so menu position is not fixed by this config. Assign an unused weight that matches the intended order.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@hugo.yaml` around lines 325 - 327, Update the Community menu entry’s weight
in hugo.yaml to an unused value that preserves its intended ordering relative to
the other menu entries, avoiding the duplicate weight used by Blog.

- name: Enterprise support
url: /support
weight: 5
Expand Down
Loading