Skip to content

Commit 65d409e

Browse files
committed
feat: restructure demo site as Wavecast Radio station with real tech podcasts (issue #3)
Overhauls the example site from isolated player demos into a polished, realistic radio station with 4 tech podcast programs: **Programs:** - Code & Circuit (AI/cloud/programming) — Coder Radio episodes - The Security Brief (cybersecurity) — Reality 2.0 + DevSecOps Talks - Open Source Spotlight (open source) — Open Source System Podcast - Deploy Friday (DevOps/SRE) — DevSecOps Talks + local demo **Pages created:** - Home page with hero, featured episode player, program grid, latest episodes - 4 program pages with episode listings and tags - 8 episode pages with podcast-player shortcodes using real MP3 URLs - Schedule page with weekly programming lineup - About page with tech stack and podcast attribution - Contact page with demo contact form - Programs listing page **Real podcast episodes embedded (with attribution):** - Coder Radio 620: 'Cloudflare\'s Sunil Pai' (fireside.fm/mp3) - Coder Radio 598: 'No Code is just Other People\'s Code' - Reality 2.0 Ep 19: 'Democratizing Cybersecurity' - DevSecOps Talks #97: 'Shift Left, Get Hacked' - DevSecOps Talks #99: 'AI SRE and the End of 3 AM On-Call' - Open Source System Podcast #13: 'Firefox Site Isolation' - Open Source System Podcast #12: 'Open Source Project Spotlight' - Local demo: 'Infrastructure as Code' (demo-audio.wav) **Infrastructure:** - Updated baseof.html with new navigation (Home, Programs, Schedule, About, Contact, GitHub), radio station header SVG, and footer nav - Added _default/list.html template for section pages - Added Hugo menu configuration in hugo.toml - Updated E2E Turbolinks test to click Programs nav link - All 80 JS unit + 21 E2E tests pass
1 parent 7870320 commit 65d409e

21 files changed

Lines changed: 892 additions & 193 deletions

exampleSite/content/_index.md

Lines changed: 74 additions & 143 deletions
Large diffs are not rendered by default.

exampleSite/content/about.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
---
2+
title: "About"
3+
---
4+
5+
<section class="hero">
6+
<h1>About Wavecast Radio</h1>
7+
<p>Tune in to Tech.</p>
8+
</section>
9+
10+
<section class="demo-section">
11+
<p>Wavecast Radio is a demo site for <a href="https://github.com/adurrr/wavecast" target="_blank" rel="noopener">Wavecast</a> — a persistent <code>&lt;podcast-player&gt;</code> Web Component built for Hugo. The site showcases what a real radio station built with Wavecast looks like: professional program pages, episode listings with chapters and posters, and — most importantly — audio that never stops, even as you navigate between pages.</p>
12+
</section>
13+
14+
<section class="demo-section">
15+
<h2>How It Works</h2>
16+
<p>The sticky footer player at the bottom of every page uses <code>data-turbolinks-permanent</code> to survive page navigation. When you start an episode and click through to other pages, the audio keeps playing uninterrupted. The footer syncs bidirectionally with every inline player on the page — pausing one pauses both.</p>
17+
<p style="margin-top:0.75rem">Key features demonstrated on this site:</p>
18+
<ul class="link-list">
19+
<li><strong>Persistent audio</strong> — navigate between pages without restarting</li>
20+
<li><strong>Bidirectional sync</strong> — inline and footer players stay in sync</li>
21+
<li><strong>Chapters</strong> — timestamp-labelled navigation within episodes</li>
22+
<li><strong>Session storage</strong> — remembers position, volume, and speed</li>
23+
<li><strong>Dark/light mode</strong> — toggle themes in the header</li>
24+
<li><strong>Multiple sources</strong> — works with local audio, remote MP3s, and streaming</li>
25+
</ul>
26+
</section>
27+
28+
<section class="demo-section">
29+
<h2>The Tech Stack</h2>
30+
<ul class="link-list">
31+
<li><strong>Hugo</strong> — static site generation (v0.158+)</li>
32+
<li><strong>Web Components</strong> — vanilla JS custom elements with Shadow DOM</li>
33+
<li><strong>Turbolinks 5</strong> — fast navigation with permanent element support</li>
34+
<li><strong>sessionStorage</strong> — cross-page state persistence</li>
35+
<li><strong>Playwright</strong> — end-to-end testing (21 tests)</li>
36+
<li><strong>Vitest</strong> — JavaScript unit testing (80 tests)</li>
37+
</ul>
38+
</section>
39+
40+
<section class="demo-section">
41+
<h2>Real Podcasts, Real Audio</h2>
42+
<p>The episodes on this site are real tech podcasts, used with attribution. We are grateful to:</p>
43+
<ul class="link-list">
44+
<li><a href="https://coder.show" target="_blank" rel="noopener">Coder Radio</a> — programming and developer culture (Jupiter Broadcasting)</li>
45+
<li><a href="https://www.reality2cast.com/" target="_blank" rel="noopener">Reality 2.0</a> — open source and technology conversations</li>
46+
<li><a href="https://devsecops.fm/" target="_blank" rel="noopener">DevSecOps Talks</a> — DevOps, security, and SRE</li>
47+
<li><a href="https://opensourcesystempodcast.vf.io/" target="_blank" rel="noopener">Open Source System Podcast</a> — open source project highlights</li>
48+
</ul>
49+
</section>
50+
51+
<div class="nav-buttons">
52+
<a href="{{< relref "programs/" >}}" class="nav-button nav-button-primary">Browse Programs</a>
53+
<a href="{{< relref "contact/" >}}" class="nav-button">Contact</a>
54+
</div>

exampleSite/content/contact.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
---
2+
title: "Contact"
3+
---
4+
5+
<section class="hero">
6+
<h1>Contact Us</h1>
7+
<p>Have a question, suggestion, or want to be a guest on one of our shows? We'd love to hear from you.</p>
8+
</section>
9+
10+
<section class="demo-section">
11+
<div class="demo-player">
12+
<h3 style="margin-bottom:1rem">Get in Touch</h3>
13+
14+
<form style="display:flex;flex-direction:column;gap:1rem;max-width:500px" onsubmit="event.preventDefault();alert('Thank you for your message! (This is a demo form — no data is sent.)')">
15+
<div>
16+
<label for="name" style="display:block;font-size:0.9rem;font-weight:600;margin-bottom:0.25rem">Name</label>
17+
<input type="text" id="name" placeholder="Your name" style="width:100%;padding:0.5rem 0.75rem;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg);color:var(--text);font-size:0.9rem">
18+
</div>
19+
20+
<div>
21+
<label for="email" style="display:block;font-size:0.9rem;font-weight:600;margin-bottom:0.25rem">Email</label>
22+
<input type="email" id="email" placeholder="you@example.com" style="width:100%;padding:0.5rem 0.75rem;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg);color:var(--text);font-size:0.9rem">
23+
</div>
24+
25+
<div>
26+
<label for="message" style="display:block;font-size:0.9rem;font-weight:600;margin-bottom:0.25rem">Message</label>
27+
<textarea id="message" rows="5" placeholder="Your message" style="width:100%;padding:0.5rem 0.75rem;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg);color:var(--text);font-size:0.9rem;resize:vertical"></textarea>
28+
</div>
29+
30+
<button type="submit" class="nav-button nav-button-primary" style="align-self:flex-start;border:none;font-size:0.9rem">Send Message</button>
31+
</form>
32+
</div>
33+
</section>
34+
35+
<section class="demo-section">
36+
<h2>Other Ways to Reach Us</h2>
37+
<ul class="link-list">
38+
<li><strong>GitHub</strong> — <a href="https://github.com/adurrr/wavecast" target="_blank" rel="noopener">github.com/adurrr/wavecast</a> (source code, issues, PRs)</li>
39+
<li><strong>Documentation</strong> — <a href="https://github.com/adurrr/wavecast#readme" target="_blank" rel="noopener">full README</a> with installation, theming, and API reference</li>
40+
</ul>
41+
</section>
42+
43+
<div class="nav-buttons">
44+
<a href="{{< relref "/" >}}" class="nav-button">← Back to Home</a>
45+
<a href="{{< relref "programs/" >}}" class="nav-button nav-button-primary">Browse Programs</a>
46+
</div>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
---
2+
title: "No Code is just Other People's Code"
3+
episode: S1E1
4+
program: "Code & Circuit"
5+
date: 2026-05-19
6+
---
7+
8+
<section class="hero">
9+
<h1>No Code is just Other People's Code</h1>
10+
<p class="episode-meta">Code &amp; Circuit &middot; Season 1, Episode 1 &middot; 45 min</p>
11+
<p>A deep dive into the no-code movement, the realities of software abstraction, and why every platform is built on mountains of traditional code.</p>
12+
</section>
13+
14+
{{< podcast-player
15+
src="https://aphid.fireside.fm/d/1437767933/b44de5fa-47c1-4e94-bf9e-c72f8d1c8f5d/1e6cfee6-871d-4eff-ba4c-d4be994753d5.mp3"
16+
title="No Code is just Other People's Code — Code & Circuit"
17+
poster="https://picsum.photos/seed/code-circuit-598/400/400"
18+
chapters="00:00:00-Intro,00:04:00-The No-Code Promise,00:12:00-Abstraction Layers,00:20:00-When No-Code Breaks,00:28:00-The Developer's Dilemma,00:35:00-Future of Programming,00:40:00-Wrap Up"
19+
>}}
20+
21+
<div class="demo-section">
22+
<h2>Show Notes</h2>
23+
<ul class="link-list">
24+
<li>The history of abstraction in software</li>
25+
<li>Why no-code platforms still need coders</li>
26+
<li>The complexity tax of visual programming</li>
27+
<li>When low-code hits the ceiling</li>
28+
<li>The future of programming tools</li>
29+
</ul>
30+
</div>
31+
32+
<p style="margin-top:2rem;font-size:0.85rem;color:var(--text-muted)">Episode from <a href="https://coder.show/598" target="_blank" rel="noopener">Coder Radio 598</a> — Jupiter Broadcasting. Used with attribution.</p>
33+
34+
<div class="nav-buttons">
35+
<a href="{{< relref "programs/code-and-circuit" >}}" class="nav-button">← Code &amp; Circuit</a>
36+
<a href="{{< relref "episodes/cr-620-cloudflare-sunil-pai" >}}" class="nav-button nav-button-primary">Next Episode →</a>
37+
</div>
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
title: "Cloudflare's Sunil Pai"
3+
episode: S1E2
4+
program: "Code & Circuit"
5+
date: 2026-05-26
6+
---
7+
8+
<section class="hero">
9+
<h1>Cloudflare's Sunil Pai</h1>
10+
<p class="episode-meta">Code &amp; Circuit &middot; Season 1, Episode 2 &middot; 41 min</p>
11+
<p>Sunil Pai joins us to discuss Cloudflare's approach to AI inference at the edge, the rise of vibe coding, the Rust and Ruby ecosystems, and what platform engineering looks like at Cloudflare's scale.</p>
12+
</section>
13+
14+
{{< podcast-player
15+
src="https://aphid.fireside.fm/d/1437767933/b44de5fa-47c1-4e94-bf9e-c72f8d1c8f5d/8e63b44a-1634-4422-907c-4b96173a0fbd.mp3"
16+
title="Cloudflare's Sunil Pai — Code & Circuit"
17+
poster="https://picsum.photos/seed/code-circuit-620/400/400"
18+
persistent="true"
19+
chapters="00:00:00-Intro,00:03:00-Cloudflare AI at the Edge,00:10:00-Vibe Coding,00:18:00-Rust & Ruby Ecosystems,00:25:00-Platform Engineering,00:33:00-Developer Experience,00:38:00-Wrap Up"
20+
>}}
21+
22+
<div class="demo-section">
23+
<h2>Show Notes</h2>
24+
<ul class="link-list">
25+
<li>Cloudflare's AI inference platform — running models at the edge</li>
26+
<li>The rise and reality of vibe coding</li>
27+
<li>Rust in the Cloudflare stack</li>
28+
<li>Ruby's place in modern infrastructure</li>
29+
<li>Platform engineering at Cloudflare scale</li>
30+
<li>Developer experience and AI-assisted workflows</li>
31+
</ul>
32+
</div>
33+
34+
<p style="margin-top:2rem;font-size:0.85rem;color:var(--text-muted)">Episode from <a href="https://coder.show/620" target="_blank" rel="noopener">Coder Radio 620</a> — Jupiter Broadcasting. Used with attribution.</p>
35+
36+
<div class="nav-buttons">
37+
<a href="{{< relref "programs/code-and-circuit" >}}" class="nav-button">← Code &amp; Circuit</a>
38+
<a href="{{< relref "episodes/cr-598-no-code" >}}" class="nav-button nav-button-primary">Previous Episode →</a>
39+
</div>
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
---
2+
title: "Infrastructure as Code: A Practical Primer"
3+
episode: S1E1
4+
program: "Deploy Friday"
5+
date: 2026-04-21
6+
---
7+
8+
<section class="hero">
9+
<h1>Infrastructure as Code: A Practical Primer</h1>
10+
<p class="episode-meta">Deploy Friday &middot; Season 1, Episode 1 &middot; 30 min</p>
11+
<p>Getting started with infrastructure-as-code — from Terraform to Pulumi to CloudFormation. Includes a live demo of provisioning a multi-region Kubernetes cluster using declarative configuration.</p>
12+
</section>
13+
14+
{{< podcast-player
15+
src="demo/demo-audio.wav"
16+
title="IaC: A Practical Primer — Deploy Friday"
17+
poster="https://picsum.photos/seed/deploy-friday-iac/400/400"
18+
chapters="00:00:00-Intro,00:03:00-What is IaC?,00:08:00-Terraform Basics,00:14:00-Pulumi vs CloudFormation,00:19:00-Live Demo: K8s Cluster,00:25:00-Pipeline Design,00:28:00-Wrap Up"
19+
>}}
20+
21+
<div class="demo-section">
22+
<h2>Show Notes</h2>
23+
<ul class="link-list">
24+
<li>Core concepts of infrastructure-as-code</li>
25+
<li>Terraform, Pulumi, and CloudFormation compared</li>
26+
<li>Common pitfalls and how to avoid them</li>
27+
<li>Designing IaC pipelines that scale</li>
28+
<li>Live demo: multi-region Kubernetes with declarative config</li>
29+
</ul>
30+
</div>
31+
32+
<div class="nav-buttons">
33+
<a href="{{< relref "programs/deploy-friday" >}}" class="nav-button">← Deploy Friday</a>
34+
<a href="{{< relref "episodes/devsecops-99-ai-sre" >}}" class="nav-button nav-button-primary">Next Episode →</a>
35+
</div>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
---
2+
title: "Shift Left, Get Hacked: Supply Chain Attacks Hit Devs"
3+
episode: S1E1
4+
program: "The Security Brief"
5+
date: 2026-04-15
6+
---
7+
8+
<section class="hero">
9+
<h1>Shift Left, Get Hacked: Supply Chain Attacks Hit Devs</h1>
10+
<p class="episode-meta">The Security Brief &middot; Season 1, Episode 1 &middot; 35 min</p>
11+
<p>March 2026 made supply chain attacks feel a lot less theoretical. This episode breaks down compromised credentials, automatic execution hooks, and how to make developer environments harder to abuse.</p>
12+
</section>
13+
14+
{{< podcast-player
15+
src="https://mcdn.podbean.com/mf/web/zn4j9tz222sfwytw/097-shift-left-get-hacked-supply-chain-attacks-hit-devs.mp3"
16+
title="Shift Left, Get Hacked — The Security Brief"
17+
poster="https://picsum.photos/seed/security-brief-97/400/400"
18+
chapters="00:00:00-Intro,00:03:00-March 2026 Incidents,00:08:00-Compromised Credentials,00:15:00-Post-Install Scripts,00:22:00-Detection & Response,00:28:00-Making Dev Environments Safer,00:32:00-Wrap Up"
19+
>}}
20+
21+
<div class="demo-section">
22+
<h2>Show Notes</h2>
23+
<ul class="link-list">
24+
<li>Supply chain attack timeline — March 2026</li>
25+
<li>How compromised publishing credentials work</li>
26+
<li>Automatic execution hooks (post-install scripts, .pth files)</li>
27+
<li>How tools detected the malicious releases</li>
28+
<li>Concrete mitigations for developer environments</li>
29+
</ul>
30+
</div>
31+
32+
<p style="margin-top:2rem;font-size:0.85rem;color:var(--text-muted)">Episode from <a href="https://devsecops.fm/episodes/097-shift-left-get-hacked-supply-chain-attacks-hit-devs/" target="_blank" rel="noopener">DevSecOps Talks #97</a>. Used with attribution.</p>
33+
34+
<div class="nav-buttons">
35+
<a href="{{< relref "programs/security-brief" >}}" class="nav-button">← The Security Brief</a>
36+
<a href="{{< relref "episodes/r2-19-democratizing-security" >}}" class="nav-button nav-button-primary">Next Episode →</a>
37+
</div>
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
title: "AI SRE and the End of 3 AM On-Call"
3+
episode: S1E2
4+
program: "Deploy Friday"
5+
date: 2026-04-28
6+
---
7+
8+
<section class="hero">
9+
<h1>AI SRE and the End of 3 AM On-Call</h1>
10+
<p class="episode-meta">Deploy Friday &middot; Season 1, Episode 2 &middot; 32 min</p>
11+
<p>Exploring the rise of AI-driven site reliability engineering — from read-only analysis to autonomous remediation, and what it means for the future of on-call.</p>
12+
</section>
13+
14+
{{< podcast-player
15+
src="https://mcdn.podbean.com/mf/web/nj196sr18hbrosf7/099-ai-sre-and-the-end-of-3-am-on-call.mp3"
16+
title="AI SRE and the End of 3 AM On-Call — Deploy Friday"
17+
poster="https://picsum.photos/seed/deploy-friday-99/400/400"
18+
persistent="true"
19+
chapters="00:00:00-Intro,00:04:00-AI Agents in Production,00:10:00-Read-Only Analysis,00:16:00-Autonomous Remediation,00:22:00-Trust-Building Journey,00:26:00-DevOps Talent Shortage,00:29:00-AI Cost Squeeze,00:31:00-Wrap Up"
20+
>}}
21+
22+
<div class="demo-section">
23+
<h2>Show Notes</h2>
24+
<ul class="link-list">
25+
<li>How AI agents are transforming incident response</li>
26+
<li>From read-only analysis to autonomous remediation — the trust journey</li>
27+
<li>Will AI really end midnight pages?</li>
28+
<li>The DevOps talent shortage and what it means for SRE</li>
29+
<li>AI cost implications for cloud operations</li>
30+
<li>Keeping customer data in customer-owned accounts</li>
31+
</ul>
32+
</div>
33+
34+
<p style="margin-top:2rem;font-size:0.85rem;color:var(--text-muted)">Episode from <a href="https://devsecops.fm/episodes/099-ai-sre-and-the-end-of-3-am-on-call/" target="_blank" rel="noopener">DevSecOps Talks #99</a>. Used with attribution.</p>
35+
36+
<div class="nav-buttons">
37+
<a href="{{< relref "programs/deploy-friday" >}}" class="nav-button">← Deploy Friday</a>
38+
<a href="{{< relref "episodes/demo-iac" >}}" class="nav-button nav-button-primary">Next Episode →</a>
39+
</div>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
---
2+
title: "Open Source Project Spotlight"
3+
episode: S1E1
4+
program: "Open Source Spotlight"
5+
date: 2026-01-15
6+
---
7+
8+
<section class="hero">
9+
<h1>Open Source Project Spotlight</h1>
10+
<p class="episode-meta">Open Source Spotlight &middot; Season 1, Episode 1 &middot; 28 min</p>
11+
<p>A curated look at five noteworthy open source projects making waves in the developer community — from developer tools to security utilities.</p>
12+
</section>
13+
14+
{{< podcast-player
15+
src="http://opensourcesystempodcast.vf.io/wp-content/uploads/2022/01/ossp-12.mp3"
16+
title="Open Source Project Spotlight — Open Source Spotlight"
17+
poster="https://picsum.photos/seed/ossp-12/400/400"
18+
chapters="00:00:00-Intro,00:03:00-Project 1: Developer Tools,00:09:00-Project 2: Web Frameworks,00:14:00-Project 3: Terminal Apps,00:19:00-Project 4: Security Utilities,00:24:00-Project 5: Go & Rust Gems,00:27:00-Wrap Up"
19+
>}}
20+
21+
<div class="demo-section">
22+
<h2>Show Notes</h2>
23+
<ul class="link-list">
24+
<li>Five open source projects you should know about</li>
25+
<li>Practical use cases and installation guides</li>
26+
<li>A mix of Go, Rust, and Python projects</li>
27+
<li>Community highlights and maintainer insights</li>
28+
<li>How to contribute to these projects</li>
29+
</ul>
30+
</div>
31+
32+
<p style="margin-top:2rem;font-size:0.85rem;color:var(--text-muted)">Episode from <a href="https://opensourcesystempodcast.vf.io/" target="_blank" rel="noopener">Open Source System Podcast</a>. Used with attribution.</p>
33+
34+
<div class="nav-buttons">
35+
<a href="{{< relref "programs/open-source-spotlight" >}}" class="nav-button">← Open Source Spotlight</a>
36+
<a href="{{< relref "episodes/ossp-13-firefox" >}}" class="nav-button nav-button-primary">Next Episode →</a>
37+
</div>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
---
2+
title: "Firefox Site Isolation & Open Source Roundup"
3+
episode: S1E2
4+
program: "Open Source Spotlight"
5+
date: 2026-02-01
6+
---
7+
8+
<section class="hero">
9+
<h1>Firefox Site Isolation &amp; Open Source Roundup</h1>
10+
<p class="episode-meta">Open Source Spotlight &middot; Season 1, Episode 2 &middot; 30 min</p>
11+
<p>A deep dive into Firefox's Site Isolation feature and a roundup of five noteworthy open source projects including OpenDrop, Neko, and PhotoPrism.</p>
12+
</section>
13+
14+
{{< podcast-player
15+
src="http://opensourcesystempodcast.vf.io/wp-content/uploads/2022/02/ossp13.mp3"
16+
title="Firefox Site Isolation — Open Source Spotlight"
17+
poster="https://picsum.photos/seed/ossp-13/400/400"
18+
persistent="true"
19+
chapters="00:00:00-Intro,00:04:00-Firefox Site Isolation,00:12:00-OpenDrop (AirDrop),00:17:00-Neko Virtual Browser,00:21:00-PhotoPrism & Spotify-TUI,00:26:00-Wrap Up"
20+
>}}
21+
22+
<div class="demo-section">
23+
<h2>Show Notes</h2>
24+
<ul class="link-list">
25+
<li><a href="https://github.com/seemoo-lab/opendrop" target="_blank" rel="noopener">OpenDrop</a> — open Apple AirDrop implementation in Python</li>
26+
<li><a href="https://github.com/m1k1o/neko" target="_blank" rel="noopener">Neko</a> — self-hosted virtual browser in Docker with WebRTC</li>
27+
<li><a href="https://github.com/photoprism/photoprism" target="_blank" rel="noopener">PhotoPrism</a> — AI-powered photo app in Go</li>
28+
<li><a href="https://github.com/Rigellute/spotify-tui" target="_blank" rel="noopener">Spotify-TUI</a> — terminal Spotify client in Rust</li>
29+
<li>Firefox Site Isolation — a security feature years in the making</li>
30+
</ul>
31+
</div>
32+
33+
<p style="margin-top:2rem;font-size:0.85rem;color:var(--text-muted)">Episode from <a href="https://opensourcesystempodcast.vf.io/" target="_blank" rel="noopener">Open Source System Podcast</a>. Used with attribution.</p>
34+
35+
<div class="nav-buttons">
36+
<a href="{{< relref "programs/open-source-spotlight" >}}" class="nav-button">← Open Source Spotlight</a>
37+
<a href="{{< relref "episodes/ossp-12-open-source-projects" >}}" class="nav-button nav-button-primary">Next Episode →</a>
38+
</div>

0 commit comments

Comments
 (0)