You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@community.apache.org by rb...@apache.org on 2026/10/19 15:56:08 UTC

(comdev-site) branch rbowen-alc-2 created (now b5c73d9e)

This is an automated email from the ASF dual-hosted git repository.

rbowen pushed a change to branch rbowen-alc-2
in repository https://gitbox.apache.org/repos/asf/comdev-site.git


      at b5c73d9e Render ALC chapters on one page; flag dormant chapters

This branch includes the following new commits:

     new b5c73d9e Render ALC chapters on one page; flag dormant chapters

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(comdev-site) 01/01: Render ALC chapters on one page; flag dormant chapters

Posted by rb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rbowen pushed a commit to branch rbowen-alc-2
in repository https://gitbox.apache.org/repos/asf/comdev-site.git

commit b5c73d9e191d414fa8205c705d11c941c38d4354
Author: Rich Bowen <rb...@rcbowen.com>
AuthorDate: Mon Oct 19 11:55:41 2026 -0400

    Render ALC chapters on one page; flag dormant chapters
    
    Following discussion on dev@community
    (https://lists.apache.org/thread.html/xvgz10zq05rlt52rwq99963v11rjz0tc),
    keep one Markdown data file per chapter but stop generating a standalone
    page for each. Chapters are now listed inline on a single /alc/chapters/
    page and link out to their wiki page; a chapter can graduate to its own
    page later by setting build.render=always.
    
    - chapters/_index.md: cascade build options (list: local, render: never)
      make chapters headless — enumerable in local collections but not
      rendered as separate pages.
    - alc_chapter_list.html: enumerate the chapters section's .Pages (not
      .Site.RegularPages, which drops headless pages) and render each chapter
      inline (title, location, status, body), linking to its own page when
      rendered, otherwise its wiki/proposal link.
    - alc_map.html: same .Pages source; marker links point at a chapter's
      page when rendered, else the wiki (external links open in a new tab,
      empty links degrade to plain text).
    
    Add a last_activity date to each chapter's front matter to track
    staleness. A chapter inactive for over a year is marked dormant: a
    distinct blue marker and legend entry on the map (kept, not hidden, so it
    can be revived) and a badge in the list. Seeded all current chapters with
    a placeholder last_activity of 2026-10-19, to be reconciled against the
    wiki over time.
    
    Update start-a-chapter.md and source/alc/README.md: corrected
    front-matter template (drop organizers, add last_activity) and document
    the single-page model, headless build options, the render=always opt-in,
    and the dormancy rule.
---
 layouts/shortcodes/alc_chapter_list.html | 53 +++++++++++++++++++---
 layouts/shortcodes/alc_map.html          | 52 ++++++++++++++++-----
 source/alc/README.md                     | 77 +++++++++++++++++++++++++++-----
 source/alc/chapters/_index.md            | 18 +++++++-
 source/alc/chapters/bangalore.md         |  1 +
 source/alc/chapters/beijing.md           |  1 +
 source/alc/chapters/budapest.md          |  1 +
 source/alc/chapters/florianopolis.md     |  1 +
 source/alc/chapters/ghana.md             |  1 +
 source/alc/chapters/hangzhou.md          |  1 +
 source/alc/chapters/indore.md            |  1 +
 source/alc/chapters/islamabad.md         |  1 +
 source/alc/chapters/lagos.md             |  1 +
 source/alc/chapters/shanghai.md          |  1 +
 source/alc/chapters/shenzhen.md          |  1 +
 source/alc/chapters/taipei.md            |  1 +
 source/alc/chapters/warsaw.md            |  1 +
 source/alc/chapters/xian.md              |  1 +
 source/alc/start-a-chapter.md            | 14 +++++-
 19 files changed, 195 insertions(+), 33 deletions(-)

diff --git a/layouts/shortcodes/alc_chapter_list.html b/layouts/shortcodes/alc_chapter_list.html
index 0eb1a292..a29724ac 100644
--- a/layouts/shortcodes/alc_chapter_list.html
+++ b/layouts/shortcodes/alc_chapter_list.html
@@ -1,20 +1,59 @@
-{{/* Text list of ALC chapters, grouped by status, from /alc/chapters/ */}}
-{{- $chapters := where (where .Site.RegularPages "Section" "alc") "Params.lat" "!=" nil }}
+{{/* Entries for every ALC chapter, grouped by status, rendered inline on
+     the single /alc/chapters/ page.
+
+     Chapters are headless pages (see source/alc/chapters/_index.md): one
+     Markdown data file each, but no standalone page is generated unless a
+     chapter opts in with `build: { render: always }` in its own front
+     matter. So we enumerate the chapters section's LOCAL `.Pages`
+     collection (which includes headless pages) rather than
+     `.Site.RegularPages` (which excludes them).
+
+     Each entry links to the chapter's own page when one is rendered,
+     otherwise to its wiki page (or proposal thread) — so there are no
+     links to 404 headless URLs. */}}
+
+{{- $section := .Site.GetPage "/alc/chapters" }}
+{{- $chapters := where $section.Pages "Params.lat" "!=" nil }}
 {{- $byStatus := $chapters.GroupByParam "status" }}
 {{- $order := slice "active" "proposed" "dissolved" }}
-<ul class="alc-chapters">
+{{/* A chapter with no activity for over a year is flagged "dormant". The
+     map hides dormant chapters; the list keeps them but marks them so the
+     staleness is visible. Threshold: one year before now. */}}
+{{- $dormantBefore := now.AddDate -1 0 0 }}
+
+<dl class="alc-chapters">
 {{- range $order }}
   {{- $status := . }}
   {{- range $byStatus }}
     {{- if eq .Key $status }}
       {{- range .Pages.ByTitle }}
-  <li>
-    <a href="{{ .RelPermalink }}">{{ .Title }}</a>
+        {{/* Does this chapter render its own page? Only then is its
+             RelPermalink a real, non-404 URL. */}}
+        {{- $rendered := false }}
+        {{- with .Params.build }}{{ if eq (.render | default "never") "always" }}{{ $rendered = true }}{{ end }}{{- end }}
+        {{- $dormant := false }}
+        {{- with .Params.last_activity }}{{ if (time .).Before $dormantBefore }}{{ $dormant = true }}{{ end }}{{- end }}
+        {{- $wiki := "" }}
+        {{- with .Params.links }}
+          {{- $wiki = or (index . "wiki") (index . "proposal") (index . "website") }}
+        {{- end }}
+        {{- $href := cond $rendered .RelPermalink ($wiki | default "") }}
+  <dt>
+    {{- if $href }}
+    <a href="{{ $href }}"{{ if not $rendered }} rel="noopener"{{ end }}>{{ .Title }}</a>
+    {{- else }}
+    {{ .Title }}
+    {{- end }}
     {{- with .Params.country }} &mdash; {{ . }}{{ end }}
     {{- if ne $status "active" }} <span class="badge badge-secondary">{{ $status }}</span>{{ end }}
-  </li>
+    {{- if $dormant }} <span class="badge badge-warning alc-dormant" title="No recorded activity in over a year">dormant</span>{{ end }}
+    {{- if and $href (not $rendered) }} <span class="alc-ext">(wiki)</span>{{ end }}
+  </dt>
+  <dd>
+    {{- with .Content }}{{ . }}{{ else }}{{ with $.Params.summary }}<p>{{ . }}</p>{{ end }}{{ end }}
+  </dd>
       {{- end }}
     {{- end }}
   {{- end }}
 {{- end }}
-</ul>
+</dl>
diff --git a/layouts/shortcodes/alc_map.html b/layouts/shortcodes/alc_map.html
index d4b2aa34..000666ad 100644
--- a/layouts/shortcodes/alc_map.html
+++ b/layouts/shortcodes/alc_map.html
@@ -61,7 +61,26 @@
   var COOKIE = "alc_map_consent";
 
   {{- $chapters := slice }}
-  {{- range (where (where .Site.RegularPages "Section" "alc") "Params.lat" "!=" nil) }}
+  {{/* Chapters are headless pages (render: never) with one data file each,
+       so enumerate the chapters section's LOCAL .Pages — .Site.RegularPages
+       excludes headless pages. Link each marker to the chapter's own page
+       only when one is actually rendered; otherwise to its wiki/proposal
+       link, so no popup links to a 404 headless URL. */}}
+  {{/* Staleness: a chapter with no activity for over a year is marked
+       DORMANT — kept on the map but shown in a distinct color (so someone
+       might revive it) rather than hidden. "activity" is the
+       `last_activity` date in front matter; a chapter without one is
+       treated as current so it is not flagged by accident. */}}
+  {{- $dormantBefore := now.AddDate -1 0 0 }}
+  {{- $section := .Site.GetPage "/alc/chapters" }}
+  {{- range (where $section.Pages "Params.lat" "!=" nil) }}
+    {{- $rendered := false }}
+    {{- with .Params.build }}{{ if eq (.render | default "never") "always" }}{{ $rendered = true }}{{ end }}{{- end }}
+    {{- $dormant := false }}
+    {{- with .Params.last_activity }}{{ if (time .).Before $dormantBefore }}{{ $dormant = true }}{{ end }}{{- end }}
+    {{- $wiki := "" }}
+    {{- with .Params.links }}{{ $wiki = or (index . "wiki") (index . "proposal") (index . "website") }}{{- end }}
+    {{- $url := cond $rendered .RelPermalink ($wiki | default "") }}
     {{- $chapters = $chapters | append (dict
           "name"    .Title
           "city"    (.Params.city | default .Title)
@@ -69,7 +88,8 @@
           "lat"     .Params.lat
           "lon"     .Params.lon
           "status"  (.Params.status | default "active")
-          "url"     .RelPermalink
+          "dormant" $dormant
+          "url"     $url
     ) }}
   {{- end }}
   var chapters = {{ $chapters | jsonify | safeJS }};
@@ -118,7 +138,7 @@
   }
 
   function buildMap() {
-    var colors = { active: "#4caf50", proposed: "#ff9800", dissolved: "#9e9e9e" };
+    var colors = { active: "#4caf50", proposed: "#ff9800", dissolved: "#9e9e9e", dormant: "#2196f3" };
     var map = L.map('alc-map').setView([20, 10], 2);
     L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
       maxZoom: 18,
@@ -127,7 +147,9 @@
 
     var bounds = [];
     chapters.forEach(function (c) {
-      var color = colors[c.status] || "#4caf50";
+      // Dormant takes visual precedence so stale chapters stand out and
+      // invite someone to revive them.
+      var color = c.dormant ? colors.dormant : (colors[c.status] || "#4caf50");
       var marker = L.circleMarker([c.lat, c.lon], {
         radius: 8, color: "#fff", weight: 2, fillColor: color, fillOpacity: 0.9
       }).addTo(map);
@@ -139,16 +161,25 @@
       // following the href.)
       var container = document.createElement("div");
       var heading = document.createElement("strong");
-      var link = document.createElement("a");
-      link.href = c.url;
-      link.textContent = c.name;
-      heading.appendChild(link);
+      if (c.url) {
+        var link = document.createElement("a");
+        link.href = c.url;
+        link.textContent = c.name;
+        // Wiki/proposal links are off-site; open them in a new tab.
+        if (/^https?:\/\//.test(c.url)) {
+          link.target = "_blank";
+          link.rel = "noopener";
+        }
+        heading.appendChild(link);
+      } else {
+        heading.textContent = c.name;
+      }
       container.appendChild(heading);
       container.appendChild(document.createElement("br"));
       container.appendChild(document.createTextNode(label));
       container.appendChild(document.createElement("br"));
       var em = document.createElement("em");
-      em.textContent = c.status;
+      em.textContent = c.dormant ? (c.status + " \u00b7 dormant") : c.status;
       container.appendChild(em);
 
       marker.bindPopup(container);
@@ -168,7 +199,8 @@
       var items = [
         ["active",    "Active"],
         ["proposed",  "Proposed"],
-        ["dissolved", "Dissolved"]
+        ["dissolved", "Dissolved"],
+        ["dormant",   "Dormant (inactive 1+ yr)"]
       ];
       var html = "";
       items.forEach(function (it) {
diff --git a/source/alc/README.md b/source/alc/README.md
index 4bbe8dc8..c1aa657a 100644
--- a/source/alc/README.md
+++ b/source/alc/README.md
@@ -2,7 +2,10 @@
 
 This directory implements the **Apache Local Community (ALC)** section of
 the ComDev website: a landing page with an interactive map of chapters, a
-per-chapter page model, a "start a chapter" guide, and an organizer guide.
+single chapters page that lists every chapter inline, a "start a chapter"
+guide, and an organizer guide. Each chapter is one Markdown data file, but
+by default no standalone page is generated for it (see "Chapter page
+model" below).
 
 ## What each file is
 
@@ -20,8 +23,10 @@ source/alc/
 │                         events, finding speakers, reporting, resources).
 └── chapters/
     ├── _index.md          Chapter list page. URL: /alc/chapters/
-    └── <city>.md          One file per chapter. Front matter drives the
-                           map + list; body is the chapter blurb.
+    └── <city>.md          One file per chapter (the data model). Front
+                           matter drives the map + list; body is the blurb
+                           shown inline on the chapters page. Headless by
+                           default — no standalone page (see below).
 ```
 
 Supporting layout files (in `layouts/shortcodes/`):
@@ -39,7 +44,52 @@ Supporting layout files (in `layouts/shortcodes/`):
   `baseof.html` is untouched and the ALC page itself makes no third-party
   request until the visitor clicks "Load the map".
 - `alc_chapter_list.html` — renders a text list of chapters grouped by
-  status, from the same front matter.
+  status, from the same front matter. Each chapter is rendered inline
+  (title, location, status, body) and links to its own page only if one is
+  rendered, otherwise to its wiki page.
+
+## Chapter page model (single page, per-chapter data files)
+
+Each chapter is one Markdown file under `chapters/` — a good, reviewable
+data model — but we do **not** generate a standalone page per chapter.
+Instead every chapter is rendered inline on the single `/alc/chapters/`
+page, and links out to its wiki page for organizers, events, and reports.
+
+This uses Hugo's build options (the "glossary" pattern). `chapters/_index.md`
+carries a cascade:
+
+```yaml
+cascade:
+  - build:
+      list: local      # keep chapters in LOCAL page collections (.Pages)
+      render: never    # but don't render a standalone page for each
+```
+
+Because `render: never` also removes pages from `.Site.RegularPages`, both
+shortcodes enumerate the chapters section via
+`.Site.GetPage "/alc/chapters"` then `.Pages` (the local collection, which
+still includes headless pages) rather than `.Site.RegularPages`.
+
+**Graduating a chapter to its own page:** when a chapter has enough content
+to warrant a dedicated page, add `build: {render: always}` to *that
+chapter's* front matter. It overrides the cascade, Hugo renders the page,
+and the list and map automatically link to the page instead of the wiki.
+
+## Dormancy / staleness
+
+Each chapter carries a `last_activity: YYYY-MM-DD` field. A chapter whose
+`last_activity` is more than **one year** before build time is flagged
+**dormant**:
+
+- On the **map** it is kept (not hidden) but drawn in a distinct color
+  (blue) with a "Dormant" legend entry, so someone might revive it.
+- In the **list** it keeps its place with a `dormant` badge.
+
+A chapter with no `last_activity` is treated as current (never
+auto-flagged). The one-year threshold is `now.AddDate -1 0 0` in both
+shortcodes. The current `last_activity` dates were set to 2026-10-19 as
+placeholders and should be reconciled against each chapter's wiki page over
+time.
 
 ## Map consent (OpenStreetMap)
 
@@ -97,7 +147,7 @@ lat: 00.0000          # decimal degrees; drives the map
 lon: 00.0000
 status: active        # active | proposed | dissolved
 started: 2026
-organizers: "Name(s) or team"
+last_activity: 2026-01-01   # YYYY-MM-DD; >1 yr old ⇒ flagged "dormant"
 links:
   website: https://example.org/
   slack: "#alc-cityname"
@@ -106,16 +156,19 @@ tags: ["alc"]
 ---
 ```
 
-Adding a chapter = adding one Markdown file here. The map and both list
-pages regenerate from it automatically; there is no separate data source.
+Adding a chapter = adding one Markdown file here. The map and the chapters
+page regenerate from it automatically; there is no separate data source.
+Organizer names are intentionally NOT stored here — they live on the
+chapter's wiki page, which each entry links to.
 
 ## How the map works
 
-`alc_map.html` uses Hugo's `where .Site.RegularPages "Section" "alc"`
-filtered to pages with a non-nil `lat`, so only chapter files appear on
-the map (the landing/guide pages are excluded). Marker color is keyed off
-`status`. The map auto-fits to the markers' bounds. Built against Hugo
-v0.111.3 (the version in the Jenkinsfile).
+`alc_map.html` enumerates the chapters section (`.Site.GetPage
+"/alc/chapters"` → `.Pages`) filtered to pages with a non-nil `lat`, so
+only chapter data files appear on the map. Marker color is keyed off
+`status`, with dormant chapters overridden to blue. The map auto-fits to
+the markers' bounds. Built against the Hugo version in the Jenkinsfile
+(0.152.2).
 
 ## Navigation wiring
 
diff --git a/source/alc/chapters/_index.md b/source/alc/chapters/_index.md
index 98920d96..7c790453 100644
--- a/source/alc/chapters/_index.md
+++ b/source/alc/chapters/_index.md
@@ -2,11 +2,25 @@
 title: ALC Chapters
 url: /alc/chapters/
 tags: ["alc"]
+# Keep one Markdown file per chapter as the data model, but do NOT generate
+# a standalone page for each one. The cascade makes every chapter headless
+# (render: never) while still listable in LOCAL collections (list: local),
+# so this page's `.Pages` can render them inline and the map/list shortcodes
+# can enumerate them. A chapter that outgrows the wiki and wants its own page
+# simply sets `build: { render: always }` in its own front matter, which
+# overrides this cascade; the list and map then link to that page instead of
+# the wiki. (Hugo "glossary" build-options pattern.)
+cascade:
+  - build:
+      list: local
+      render: never
 ---
 
 Below are the current [Apache Local Community](/alc/) chapters. Each
-chapter is one Markdown file in this directory; the
-[map and list on the ALC landing page](/alc/) are generated from them.
+chapter is one Markdown file in this directory. For now, most chapters
+link out to their wiki page for organizers, events, and reports; a chapter
+can graduate to its own page here when there's enough content to warrant
+one.
 
 {{< alc_chapter_list >}}
 
diff --git a/source/alc/chapters/bangalore.md b/source/alc/chapters/bangalore.md
index 2c3cf1b1..88a96cc4 100644
--- a/source/alc/chapters/bangalore.md
+++ b/source/alc/chapters/bangalore.md
@@ -5,6 +5,7 @@ country: India
 lat: 12.9716
 lon: 77.5946
 status: active
+last_activity: 2026-10-19   # YYYY-MM-DD; placeholder set 2026-10-19, verify against the chapter's wiki page
 links:
   wiki: https://cwiki.apache.org/confluence/display/COMDEV/ALC+Bangalore
 tags: ["alc"]
diff --git a/source/alc/chapters/beijing.md b/source/alc/chapters/beijing.md
index aba6af96..d9b9be51 100644
--- a/source/alc/chapters/beijing.md
+++ b/source/alc/chapters/beijing.md
@@ -5,6 +5,7 @@ country: China
 lat: 39.9042
 lon: 116.4074
 status: active
+last_activity: 2026-10-19   # YYYY-MM-DD; placeholder set 2026-10-19, verify against the chapter's wiki page
 links:
   wiki: https://cwiki.apache.org/confluence/display/COMDEV/ALC+Beijing
 tags: ["alc"]
diff --git a/source/alc/chapters/budapest.md b/source/alc/chapters/budapest.md
index e614ccdf..96c3822a 100644
--- a/source/alc/chapters/budapest.md
+++ b/source/alc/chapters/budapest.md
@@ -5,6 +5,7 @@ country: Hungary
 lat: 47.4979
 lon: 19.0402
 status: active
+last_activity: 2026-10-19   # YYYY-MM-DD; placeholder set 2026-10-19, verify against the chapter's wiki page
 links:
   wiki: https://cwiki.apache.org/confluence/display/COMDEV/ALC+Budapest
 tags: ["alc"]
diff --git a/source/alc/chapters/florianopolis.md b/source/alc/chapters/florianopolis.md
index e3cab720..d30e0bb4 100644
--- a/source/alc/chapters/florianopolis.md
+++ b/source/alc/chapters/florianopolis.md
@@ -5,6 +5,7 @@ country: Brazil
 lat: -27.5954
 lon: -48.548
 status: active
+last_activity: 2026-10-19   # YYYY-MM-DD; placeholder set 2026-10-19, verify against the chapter's wiki page
 links:
   wiki: https://cwiki.apache.org/confluence/spaces/COMDEV/pages/399278973/ALC+Florian%C3%B3polis
 tags: ["alc"]
diff --git a/source/alc/chapters/ghana.md b/source/alc/chapters/ghana.md
index ff40cda7..b71ab897 100644
--- a/source/alc/chapters/ghana.md
+++ b/source/alc/chapters/ghana.md
@@ -5,6 +5,7 @@ country: Ghana
 lat: 10.0607
 lon: -2.5099
 status: proposed
+last_activity: 2026-10-19   # YYYY-MM-DD; placeholder set 2026-10-19, verify against the chapter's wiki page
 started: 2026
 links:
   proposal: https://lists.apache.org/thread/1m3yjxmtqrqcy6ntnhop95hjf9odoy85
diff --git a/source/alc/chapters/hangzhou.md b/source/alc/chapters/hangzhou.md
index c2e0ae4d..6a2bf5bd 100644
--- a/source/alc/chapters/hangzhou.md
+++ b/source/alc/chapters/hangzhou.md
@@ -5,6 +5,7 @@ country: China
 lat: 30.2741
 lon: 120.1551
 status: active
+last_activity: 2026-10-19   # YYYY-MM-DD; placeholder set 2026-10-19, verify against the chapter's wiki page
 links:
   wiki: https://cwiki.apache.org/confluence/display/COMDEV/ALC+Hangzhou
 tags: ["alc"]
diff --git a/source/alc/chapters/indore.md b/source/alc/chapters/indore.md
index 3d34a152..16620d62 100644
--- a/source/alc/chapters/indore.md
+++ b/source/alc/chapters/indore.md
@@ -5,6 +5,7 @@ country: India
 lat: 22.7196
 lon: 75.8577
 status: active
+last_activity: 2026-10-19   # YYYY-MM-DD; placeholder set 2026-10-19, verify against the chapter's wiki page
 links:
   wiki: https://cwiki.apache.org/confluence/display/COMDEV/ALC+Indore
 tags: ["alc"]
diff --git a/source/alc/chapters/islamabad.md b/source/alc/chapters/islamabad.md
index 1a0d2754..383b2f28 100644
--- a/source/alc/chapters/islamabad.md
+++ b/source/alc/chapters/islamabad.md
@@ -5,6 +5,7 @@ country: Pakistan
 lat: 33.6844
 lon: 73.0479
 status: active
+last_activity: 2026-10-19   # YYYY-MM-DD; placeholder set 2026-10-19, verify against the chapter's wiki page
 started: 2026
 links:
   wiki: https://cwiki.apache.org/confluence/display/COMDEV/ALC+Islamabad
diff --git a/source/alc/chapters/lagos.md b/source/alc/chapters/lagos.md
index 65d938e3..c2d3423e 100644
--- a/source/alc/chapters/lagos.md
+++ b/source/alc/chapters/lagos.md
@@ -5,6 +5,7 @@ country: Nigeria
 lat: 6.5244
 lon: 3.3792
 status: active
+last_activity: 2026-10-19   # YYYY-MM-DD; placeholder set 2026-10-19, verify against the chapter's wiki page
 links:
   wiki: https://cwiki.apache.org/confluence/display/COMDEV/ALC+Lagos
 tags: ["alc"]
diff --git a/source/alc/chapters/shanghai.md b/source/alc/chapters/shanghai.md
index a2c410c0..96675eb4 100644
--- a/source/alc/chapters/shanghai.md
+++ b/source/alc/chapters/shanghai.md
@@ -5,6 +5,7 @@ country: China
 lat: 31.2304
 lon: 121.4737
 status: active
+last_activity: 2026-10-19   # YYYY-MM-DD; placeholder set 2026-10-19, verify against the chapter's wiki page
 links:
   wiki: https://cwiki.apache.org/confluence/display/COMDEV/ALC+Shanghai
 tags: ["alc"]
diff --git a/source/alc/chapters/shenzhen.md b/source/alc/chapters/shenzhen.md
index 642b6c1d..7aca87e1 100644
--- a/source/alc/chapters/shenzhen.md
+++ b/source/alc/chapters/shenzhen.md
@@ -5,6 +5,7 @@ country: China
 lat: 22.5431
 lon: 114.0579
 status: active
+last_activity: 2026-10-19   # YYYY-MM-DD; placeholder set 2026-10-19, verify against the chapter's wiki page
 links:
   wiki: https://cwiki.apache.org/confluence/display/COMDEV/ALC+Shenzhen
 tags: ["alc"]
diff --git a/source/alc/chapters/taipei.md b/source/alc/chapters/taipei.md
index 44613ea8..22118910 100644
--- a/source/alc/chapters/taipei.md
+++ b/source/alc/chapters/taipei.md
@@ -5,6 +5,7 @@ country: Taiwan
 lat: 25.033
 lon: 121.5654
 status: active
+last_activity: 2026-10-19   # YYYY-MM-DD; placeholder set 2026-10-19, verify against the chapter's wiki page
 links:
   wiki: https://cwiki.apache.org/confluence/display/COMDEV/ALC+Taipei
 tags: ["alc"]
diff --git a/source/alc/chapters/warsaw.md b/source/alc/chapters/warsaw.md
index 7645a974..35d5fb8a 100644
--- a/source/alc/chapters/warsaw.md
+++ b/source/alc/chapters/warsaw.md
@@ -5,6 +5,7 @@ country: Poland
 lat: 52.2297
 lon: 21.0122
 status: active
+last_activity: 2026-10-19   # YYYY-MM-DD; placeholder set 2026-10-19, verify against the chapter's wiki page
 links:
   wiki: https://cwiki.apache.org/confluence/display/COMDEV/ALC+Warsaw
 tags: ["alc"]
diff --git a/source/alc/chapters/xian.md b/source/alc/chapters/xian.md
index 64377357..811d81ea 100644
--- a/source/alc/chapters/xian.md
+++ b/source/alc/chapters/xian.md
@@ -5,6 +5,7 @@ country: China
 lat: 34.3416
 lon: 108.9398
 status: active
+last_activity: 2026-10-19   # YYYY-MM-DD; placeholder set 2026-10-19, verify against the chapter's wiki page
 links:
   wiki: https://cwiki.apache.org/confluence/spaces/COMDEV/pages/263429100/ALC+Xi+an
 tags: ["alc"]
diff --git a/source/alc/start-a-chapter.md b/source/alc/start-a-chapter.md
index d1a1690e..82329d4b 100644
--- a/source/alc/start-a-chapter.md
+++ b/source/alc/start-a-chapter.md
@@ -70,7 +70,12 @@ lat: 00.0000
 lon: 00.0000
 status: active        # active | proposed | dissolved
 started: 2026
-organizers: "Name(s) or team"
+last_activity: 2026-01-01   # YYYY-MM-DD of the chapter's most recent
+                            # activity. A chapter with no activity for over
+                            # a year is marked "dormant" — a distinct color
+                            # on the map and a badge in the list (not hidden,
+                            # so it can be revived). Organizer names are NOT
+                            # listed here — they live on the wiki page.
 links:
   website: https://example.org/
   slack: "#alc-cityname"
@@ -81,4 +86,9 @@ A short paragraph about the chapter, its focus, and how to get involved.
 ```
 
 The map and the chapter list are generated automatically from these
-files, so a pull request adding one Markdown file is all it takes.
+files, so a pull request adding one Markdown file is all it takes. By
+default a chapter does **not** get its own page — all chapters are listed
+together on the [chapters page](/alc/chapters/), each linking to its wiki
+page. When a chapter has enough content to warrant a dedicated page, add
+`build: {render: always}` to its front matter and the list and map will
+link to that page instead of the wiki.