-
Notifications
You must be signed in to change notification settings - Fork 31
feat(community): add a Community page and link it from the main menu #637
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,4 @@ | ||
| # Imported | ||
| community.md | ||
| contributing.md | ||
| governance.md | ||
| security.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. | ||
|
|
||
| - [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 | | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -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
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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.htmlRepository: 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.mdRepository: 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 -SRepository: cozystack/website Length of output: 50374 🌐 Web query:
💡 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.
🤖 Prompt for AI Agents🎯 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 || trueRepository: 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 -200Repository: 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 -250Repository: cozystack/website Length of output: 41857 🌐 Web query:
💡 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:
💡 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
🤖 Prompt for AI Agents |
||
| - name: Enterprise support | ||
| url: /support | ||
| weight: 5 | ||
|
|
||
There was a problem hiding this comment.
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:
Repository: cozystack/website
Length of output: 346
🏁 Script executed:
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
meetingsanchor used by the homepage.layouts/shortcodes/home/calendar.htmllinks to/community/#meetings, butcontent/en/community.mduses## Community meeting, which generatescommunity-meeting. Add a hiddenmeetingsanchor before the heading or update the link to the generated heading ID.🤖 Prompt for AI Agents