Build Hugo content templates and archive
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
jmservera committed
May 18, 2026 at 10:48 UTC
05372c385430cf49e2a16f9b0baa8a706a29de27
13 files changed
+451
-11
.squad/agents/amy/history.md
+3
@@ -17,3 +17,6 @@
17
- **2026-05-18T10:27:35.339+02:00:** Hugo now scaffolds from the repo root with the primary site config in `hugo.toml` and the PaperMod theme installed as a git submodule at `themes/PaperMod`.
18
- **2026-05-18T10:27:35.339+02:00:** The MVP content structure lives under `content/weekly/`, `content/monthly/`, and `content/yearly/`, with archive/search entry pages at `content/archive.md` and `content/search.md`.
19
- **2026-05-18T10:27:35.339+02:00:** GitHub Pages deployment for the Hugo site is wired through `.github/workflows/deploy-site.yml`, and local builds should use `hugo --minify` after initializing submodules.
20
+- **2026-05-18T10:27:35.339+02:00:** Homepage and archive rendering now live in Hugo section/layout templates (`layouts/index.html`, `layouts/archive/list.html`, `layouts/weekly/single.html`) so the newest weekly summary, archive chronology, and per-report metric cards render without manual editing.
21
+- **2026-05-18T10:27:35.339+02:00:** Weekly content generation should follow the `archetypes/weekly.md` frontmatter schema: `title`, `date`, `week`, `tags`, `categories`, `repos_featured`, `stars_tracked`, `top_repo`, and `summary`, followed by the five standard analysis sections.
22
+- **2026-05-18T10:27:35.339+02:00:** RSS is enabled through Hugo outputs in `hugo.toml`, and the verified root feed for this setup is `public/index.xml` alongside section and taxonomy RSS pages.
archetypes/weekly.md
new
+32
@@ -0,0 +1,32 @@
1
+---
2
+title: "Week NN, YYYY"
3
+date: "{{ .Date | time.Format \"2006-01-02\" }}"
4
+week: "YYYY-WNN"
5
+tags: []
6
+categories: [weekly]
7
+repos_featured: 0
8
+stars_tracked: 0
9
+top_repo: ""
10
+summary: ""
11
+draft: true
12
+---
13
+
14
+## Notable New Repositories
15
+
16
+- Add the standout launches from this week.
17
+
18
+## Trending This Week
19
+
20
+- Explain which projects gained attention and why.
21
+
22
+## Trend Analysis
23
+
24
+Summarize the broader technical patterns behind the week's movement.
25
+
26
+## What's Missing
27
+
28
+Call out important gaps, blind spots, or themes that did not get enough attention.
29
+
30
+## Conclusion
31
+
32
+Close with the practical takeaway for readers following GitHub's evolving signal.
assets/css/extended/squadscope.css
new
+148
@@ -0,0 +1,148 @@
1
+.home-shell {
2
+ display: grid;
3
+ gap: 2rem;
4
+}
5
+
6
+.home-hero,
7
+.home-latest,
8
+.home-empty-state,
9
+.home-report-card,
10
+.home-nav-card,
11
+.metric-card,
12
+.report-shortcuts {
13
+ border: 1px solid var(--border);
14
+ border-radius: var(--radius);
15
+ background: var(--entry);
16
+}
17
+
18
+.home-hero,
19
+.home-latest,
20
+.home-empty-state {
21
+ padding: 1.5rem;
22
+}
23
+
24
+.home-eyebrow,
25
+.section-topline,
26
+.metric-label {
27
+ display: block;
28
+ color: var(--secondary);
29
+ font-size: 0.85rem;
30
+ letter-spacing: 0.04em;
31
+ text-transform: uppercase;
32
+}
33
+
34
+.home-description {
35
+ font-size: 1.05rem;
36
+ margin: 0.5rem 0 1rem;
37
+}
38
+
39
+.home-nav-grid,
40
+.report-metrics,
41
+.home-report-list {
42
+ display: grid;
43
+ gap: 1rem;
44
+}
45
+
46
+.home-nav-grid {
47
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
48
+}
49
+
50
+.home-nav-card {
51
+ display: grid;
52
+ gap: 0.5rem;
53
+ padding: 1rem;
54
+ text-decoration: none;
55
+}
56
+
57
+.home-nav-title {
58
+ color: var(--primary);
59
+ font-weight: 700;
60
+}
61
+
62
+.home-nav-copy {
63
+ color: var(--secondary);
64
+ font-size: 0.95rem;
65
+}
66
+
67
+.report-metrics {
68
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
69
+ margin: 1.25rem 0;
70
+}
71
+
72
+.metric-card {
73
+ padding: 1rem;
74
+}
75
+
76
+.metric-card-wide {
77
+ grid-column: span 2;
78
+}
79
+
80
+.metric-value {
81
+ display: block;
82
+ font-size: 1.05rem;
83
+ margin-top: 0.35rem;
84
+}
85
+
86
+.home-actions,
87
+.report-shortcuts {
88
+ display: flex;
89
+ flex-wrap: wrap;
90
+ gap: 0.75rem;
91
+ align-items: center;
92
+}
93
+
94
+.home-action-primary,
95
+.home-action-secondary,
96
+.report-shortcuts a {
97
+ display: inline-flex;
98
+ align-items: center;
99
+ justify-content: center;
100
+ min-height: 2.5rem;
101
+ padding: 0 0.9rem;
102
+ border-radius: 999px;
103
+ text-decoration: none;
104
+}
105
+
106
+.home-action-primary {
107
+ background: var(--primary);
108
+ color: var(--theme);
109
+}
110
+
111
+.home-action-secondary,
112
+.report-shortcuts a {
113
+ border: 1px solid var(--border);
114
+}
115
+
116
+.home-report-list {
117
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
118
+}
119
+
120
+.home-report-card,
121
+.squad-archive-entry {
122
+ padding: 1rem;
123
+}
124
+
125
+.home-report-card h3,
126
+.squad-archive-entry h4 {
127
+ margin-top: 0;
128
+ margin-bottom: 0.5rem;
129
+}
130
+
131
+.home-report-meta {
132
+ display: flex;
133
+ flex-wrap: wrap;
134
+ gap: 0.75rem;
135
+ color: var(--secondary);
136
+ font-size: 0.9rem;
137
+}
138
+
139
+.squad-report .report-shortcuts {
140
+ margin-bottom: 1.5rem;
141
+ padding: 0.75rem;
142
+}
143
+
144
+@media (max-width: 640px) {
145
+ .metric-card-wide {
146
+ grid-column: span 1;
147
+ }
148
+}
content/_index.md
+5
-2
@@ -2,7 +2,10 @@
2
title = 'SquadScope'
3
date = '2026-05-18T10:27:35.339+02:00'
4
draft = false
5
-summary = 'Weekly tech trend summaries sourced from GitHub.'
5
+summary = 'Follow the latest weekly GitHub trend analysis, then dive into monthly, yearly, and archive views.'
6
+description = 'Start with the newest weekly report and navigate the full SquadScope timeline.'
7
+++
8
8
-SquadScope publishes weekly signal, monthly rollups, and yearly retrospectives so readers can track what matters on GitHub without chasing every trend feed.
9
+SquadScope surfaces the strongest weekly signal from GitHub activity, then organizes that analysis into monthly and yearly views for long-term pattern spotting.
10
+
11
+Use the homepage to jump straight into the latest summary, scan the archive, or move up to broader rollups when you want a bigger-picture view.
content/archive.md
deleted
-9
@@ -1,9 +0,0 @@
1
-+++
2
-title = 'Archive'
3
-date = '2026-05-18T10:27:35.339+02:00'
4
-draft = false
5
-layout = 'archives'
6
-summary = 'Browse the full SquadScope archive.'
7
-+++
8
-
9
-Use the archive to scan every published SquadScope entry in chronological order.
content/archive/_index.md
new
+8
@@ -0,0 +1,8 @@
1
++++
2
+title = 'Archive'
3
+date = '2026-05-18T10:27:35.339+02:00'
4
+draft = false
5
+summary = 'Browse every published weekly SquadScope summary in chronological order.'
6
++++
7
+
8
+The archive is the fastest way to scan every weekly report by publication date and revisit earlier signals as the project grows.
content/monthly/2026/05.md
new
+17
@@ -0,0 +1,17 @@
1
++++
2
+title = 'May 2026 Rollup'
3
+date = '2026-05-18'
4
+draft = false
5
+summary = 'Placeholder monthly rollup used to validate navigation and section rendering.'
6
+tags = ['ai', 'devtools', 'rust']
7
+categories = ['monthly']
8
+month = '2026-05'
9
++++
10
+
11
+This placeholder monthly page exists so the homepage and navigation can point to a valid month-level summary while the generator pipeline is still being built.
12
+
13
+## Signals to capture
14
+
15
+- Repeated themes across weekly reports
16
+- Category momentum worth watching
17
+- Standout repositories that kept showing up
content/weekly/2026/W21.md
new
+34
@@ -0,0 +1,34 @@
1
+---
2
+title: "Week 21, 2026"
3
+date: 2026-05-18
4
+week: "2026-W21"
5
+tags: [ai, devtools, rust, security]
6
+categories: [weekly]
7
+repos_featured: 12
8
+stars_tracked: 847203
9
+top_repo: "acme/shipyard"
10
+summary: "Placeholder weekly report used to validate the SquadScope homepage, archive, and report template rendering."
11
+draft: false
12
+---
13
+
14
+## Notable New Repositories
15
+
16
+- **acme/shipyard** — a fictional platform engineering toolkit used here as placeholder content for layout validation.
17
+- **open-labs/rivet-rs** — a placeholder Rust workflow engine representing systems and tooling interest.
18
+- **secure-by-default/lockwatch** — a sample security repo standing in for the week's defensive tooling launches.
19
+
20
+## Trending This Week
21
+
22
+The placeholder leaderboard is led by **acme/shipyard**, which represents the kind of repo that attracts rapid stars when it promises to simplify internal developer platforms. The supporting examples point to familiar SquadScope themes: AI-adjacent tooling, Rust-based infrastructure, and security automation.
23
+
24
+## Trend Analysis
25
+
26
+Even in this sample content, the pattern is clear: developers continue rewarding tools that reduce platform friction, improve deployment confidence, and make complex workflows easier to operate. For the frontend, that means the weekly template needs to present both raw momentum and a brief explanation of why the movement matters.
27
+
28
+## What's Missing
29
+
30
+This placeholder issue deliberately leaves out mobile, design systems, and developer education projects. That gap is useful because it confirms the template can call attention to missing conversations instead of only repeating the loudest trends.
31
+
32
+## Conclusion
33
+
34
+Use this sample page as the reference shape for generated weekly summaries: a compact headline, a few clear metrics, and five repeatable sections that make the analysis easy to scan.
content/yearly/2026.md
new
+17
@@ -0,0 +1,17 @@
1
++++
2
+title = '2026 Year in Review'
3
+date = '2026-05-18'
4
+draft = false
5
+summary = 'Placeholder yearly summary used to validate the long-view SquadScope structure.'
6
+tags = ['platform', 'security', 'tooling']
7
+categories = ['yearly']
8
+year = '2026'
9
++++
10
+
11
+This placeholder yearly page confirms that Hugo can route a long-view trend summary alongside the weekly and monthly content hierarchy.
12
+
13
+## Themes to watch
14
+
15
+- Platform engineering maturity
16
+- Security defaults becoming product features
17
+- Tooling that collapses operational complexity
layouts/archive/list.html
new
+35
@@ -0,0 +1,35 @@
1
+{{- define "main" -}}
2
+{{- $weeklyPages := (where site.RegularPages "Type" "weekly").ByDate.Reverse -}}
3
+<header class="page-header">
4
+ <h1>{{ .Title }}</h1>
5
+ {{- with .Description }}
6
+ <div class="post-description">{{ . }}</div>
7
+ {{- end }}
8
+</header>
9
+
10
+{{- if .Content }}
11
+<div class="post-content md-content">
12
+ {{ .Content }}
13
+</div>
14
+{{- end }}
15
+
16
+{{- range $weeklyPages.GroupByDate "2006" -}}
17
+<div class="archive-year">
18
+ <h2 class="archive-year-header">{{ .Key }} <sup class="archive-count">{{ len .Pages }}</sup></h2>
19
+ {{- range .Pages.GroupByDate "January" -}}
20
+ <div class="archive-month">
21
+ <h3 class="archive-month-header">{{ .Key }} <sup class="archive-count">{{ len .Pages }}</sup></h3>
22
+ <div class="archive-posts squad-archive-posts">
23
+ {{- range .Pages -}}
24
+ <article class="archive-entry squad-archive-entry">
25
+ <h4 class="archive-entry-title"><a href="{{ .RelPermalink }}">{{ .Title }}</a></h4>
26
+ <div class="archive-meta">{{ .Date.Format "2006-01-02" }}</div>
27
+ <p>{{ .Params.summary | default .Summary }}</p>
28
+ </article>
29
+ {{- end -}}
30
+ </div>
31
+ </div>
32
+ {{- end -}}
33
+</div>
34
+{{- end -}}
35
+{{- end -}}
layouts/index.html
new
+72
@@ -0,0 +1,72 @@
1
+{{- define "main" -}}
2
+{{- $weeklyPages := (where site.RegularPages "Type" "weekly").ByDate.Reverse -}}
3
+
4
+<div class="home-shell">
5
+ <section class="home-hero">
6
+ <p class="home-eyebrow">Weekly tech signal from GitHub</p>
7
+ <h1>{{ .Title }}</h1>
8
+ {{- with .Params.description }}
9
+ <p class="home-description">{{ . }}</p>
10
+ {{- end }}
11
+ <div class="post-content md-content">
12
+ {{ .Content }}
13
+ </div>
14
+ </section>
15
+
16
+ <section class="home-nav-grid" aria-label="Primary views">
17
+ <a class="home-nav-card" href="{{ "/archive/" | relURL }}">
18
+ <span class="home-nav-title">Archive</span>
19
+ <span class="home-nav-copy">Browse every weekly summary in reverse chronological order.</span>
20
+ </a>
21
+ <a class="home-nav-card" href="{{ "/monthly/" | relURL }}">
22
+ <span class="home-nav-title">Monthly</span>
23
+ <span class="home-nav-copy">Step back and review the strongest themes across each month.</span>
24
+ </a>
25
+ <a class="home-nav-card" href="{{ "/yearly/" | relURL }}">
26
+ <span class="home-nav-title">Yearly</span>
27
+ <span class="home-nav-copy">Follow broader platform shifts and long-running trend lines.</span>
28
+ </a>
29
+ <a class="home-nav-card" href="{{ "/index.xml" | relURL }}">
30
+ <span class="home-nav-title">RSS</span>
31
+ <span class="home-nav-copy">Subscribe to the newest reports in your feed reader.</span>
32
+ </a>
33
+ </section>
34
+
35
+ {{- if gt (len $weeklyPages) 0 -}}
36
+ {{- $latest := index $weeklyPages 0 -}}
37
+ <section class="home-latest" aria-labelledby="latest-report-heading">
38
+ <div class="section-topline">Latest weekly summary</div>
39
+ <h2 id="latest-report-heading"><a href="{{ $latest.RelPermalink }}">{{ $latest.Title }}</a></h2>
40
+ <p>{{ $latest.Params.summary | default $latest.Summary }}</p>
41
+ {{ partial "report-metrics.html" $latest }}
42
+ <div class="home-actions">
43
+ <a class="home-action-primary" href="{{ $latest.RelPermalink }}">Read summary</a>
44
+ <a class="home-action-secondary" href="{{ "/archive/" | relURL }}">Open archive</a>
45
+ </div>
46
+ </section>
47
+ {{- else -}}
48
+ <section class="home-empty-state">
49
+ <div class="section-topline">Latest weekly summary</div>
50
+ <h2>No weekly report published yet</h2>
51
+ <p>The homepage will automatically feature the newest report as soon as the first weekly summary lands in <code>content/weekly/</code>.</p>
52
+ </section>
53
+ {{- end -}}
54
+
55
+ <section class="home-recent" aria-labelledby="recent-reports-heading">
56
+ <div class="section-topline">Recent weekly reports</div>
57
+ <h2 id="recent-reports-heading">Browse the latest entries</h2>
58
+ <div class="home-report-list">
59
+ {{- range first 5 $weeklyPages -}}
60
+ <article class="home-report-card">
61
+ <h3><a href="{{ .RelPermalink }}">{{ .Title }}</a></h3>
62
+ <p>{{ .Params.summary | default .Summary }}</p>
63
+ <div class="home-report-meta">
64
+ <span>{{ .Date.Format "2006-01-02" }}</span>
65
+ {{- with .Params.categories }}<span>{{ delimit . ", " }}</span>{{- end }}
66
+ </div>
67
+ </article>
68
+ {{- end -}}
69
+ </div>
70
+ </section>
71
+</div>
72
+{{- end -}}
layouts/partials/report-metrics.html
new
+33
@@ -0,0 +1,33 @@
1
+{{- $page := . -}}
2
+{{- $hasWeek := and (isset $page.Params "week") (ne (index $page.Params "week") "") -}}
3
+{{- $hasRepos := isset $page.Params "repos_featured" -}}
4
+{{- $hasStars := isset $page.Params "stars_tracked" -}}
5
+{{- $hasTopRepo := and (isset $page.Params "top_repo") (ne (index $page.Params "top_repo") "") -}}
6
+{{- if or $hasWeek $hasRepos $hasStars $hasTopRepo -}}
7
+<div class="report-metrics">
8
+ {{- if $hasWeek -}}
9
+ <div class="metric-card">
10
+ <span class="metric-label">Week</span>
11
+ <strong class="metric-value">{{ index $page.Params "week" }}</strong>
12
+ </div>
13
+ {{- end -}}
14
+ {{- if $hasRepos -}}
15
+ <div class="metric-card">
16
+ <span class="metric-label">Repos featured</span>
17
+ <strong class="metric-value">{{ index $page.Params "repos_featured" }}</strong>
18
+ </div>
19
+ {{- end -}}
20
+ {{- if $hasStars -}}
21
+ <div class="metric-card">
22
+ <span class="metric-label">Stars tracked</span>
23
+ <strong class="metric-value">{{ index $page.Params "stars_tracked" }}</strong>
24
+ </div>
25
+ {{- end -}}
26
+ {{- if $hasTopRepo -}}
27
+ <div class="metric-card metric-card-wide">
28
+ <span class="metric-label">Top repo</span>
29
+ <strong class="metric-value"><a href="https://github.com/{{ index $page.Params "top_repo" }}">{{ index $page.Params "top_repo" }}</a></strong>
30
+ </div>
31
+ {{- end -}}
32
+</div>
33
+{{- end -}}
layouts/weekly/single.html
new
+47
@@ -0,0 +1,47 @@
1
+{{- define "main" }}
2
+<article class="post-single squad-report">
3
+ <header class="post-header">
4
+ {{ partial "breadcrumbs.html" . }}
5
+ <p class="section-topline">Weekly summary</p>
6
+ <h1 class="post-title entry-hint-parent">{{ .Title }}</h1>
7
+ {{- with (.Description | default .Params.summary) }}
8
+ <div class="post-description">{{ . }}</div>
9
+ {{- end }}
10
+ <div class="post-meta">
11
+ {{- partial "post_meta.html" . -}}
12
+ {{- partial "translation_list.html" . -}}
13
+ {{- partial "edit_post.html" . -}}
14
+ {{- partial "post_canonical.html" . -}}
15
+ </div>
16
+ </header>
17
+
18
+ {{ partial "report-metrics.html" . }}
19
+
20
+ <nav class="report-shortcuts" aria-label="Report navigation">
21
+ <a href="{{ "/archive/" | relURL }}">Archive</a>
22
+ <a href="{{ "/monthly/" | relURL }}">Monthly</a>
23
+ <a href="{{ "/yearly/" | relURL }}">Yearly</a>
24
+ <a href="{{ "/index.xml" | relURL }}">RSS</a>
25
+ </nav>
26
+
27
+ <div class="post-content md-content">
28
+ {{ .Content }}
29
+ </div>
30
+
31
+ <footer class="post-footer">
32
+ {{- $tags := .Language.Params.Taxonomies.tag | default "tags" }}
33
+ {{- $categories := .Language.Params.Taxonomies.category | default "categories" }}
34
+ <ul class="post-tags">
35
+ {{- range ($.GetTerms $categories) }}
36
+ <li><a href="{{ .Permalink }}">{{ .LinkTitle }}</a></li>
37
+ {{- end }}
38
+ {{- range ($.GetTerms $tags) }}
39
+ <li><a href="{{ .Permalink }}">{{ .LinkTitle }}</a></li>
40
+ {{- end }}
41
+ </ul>
42
+ {{- if (.Param "ShowPostNavLinks") }}
43
+ {{- partial "post_nav_links.html" . }}
44
+ {{- end }}
45
+ </footer>
46
+</article>
47
+{{- end }}