Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
59d4c19
Created plan for updating the sponsors page
mrbiggred Apr 7, 2026
f6dc59c
Merge branch 'main' into feature/sponsor-page
mrbiggred Apr 19, 2026
9044ae4
Update AGENTS.md to include Docker Compose usage instructions for con…
mrbiggred Apr 19, 2026
4c87cc7
Refine sponsors page implementation plan: clarify YAML structure, con…
mrbiggred Apr 19, 2026
a83db1b
Add mkdocs-macros-plugin for YAML inclusion and update requirements
mrbiggred Apr 20, 2026
11640f1
Updated to sponsors page plan to prevent duplicating sponsor info.
mrbiggred Apr 20, 2026
75a3237
Created sponsor data yml file.
mrbiggred Apr 20, 2026
1ff86bc
Refactor sponsors page to load the sponsors from the yml data.
mrbiggred Apr 20, 2026
6125981
Removed corporate and individual sections from the sponsor page.
mrbiggred Apr 22, 2026
9435b06
WIP: Updated the sponsor page layout.
mrbiggred Apr 23, 2026
06f0e47
Moved sponsor css to it's own file.
mrbiggred Apr 23, 2026
2513914
Update sponsor page layout and styles
mrbiggred Apr 29, 2026
b6987c1
Fixed gap above and below lead text.
mrbiggred Apr 30, 2026
48f1c0b
Simplify the sponsors css
mrbiggred May 1, 2026
9d59e81
Tweaking the sponsorship page content and buttons.
mrbiggred May 5, 2026
cbd1780
Refactor sponsor descriptions and remove test entries.
mrbiggred May 8, 2026
37a838d
Remove implementation plan for sponsors and donors page
mrbiggred May 8, 2026
b3441e0
Add documentation for updating sponsors and project structure
mrbiggred May 8, 2026
fc17b7c
Fixed typos in the copy on the sponsors page.
mrbiggred May 10, 2026
515fbd6
Remove broken WARNING fallback for unknown sponsor IDs
mrbiggred May 10, 2026
619c611
Remove unused Stripe buy button script from sponsors page
mrbiggred May 10, 2026
fe774c6
WIP: Trying dialog for more sponsor info
mrbiggred May 10, 2026
5616967
WIP: Updating the sponsor boxes responsiveness.
mrbiggred May 13, 2026
0a75a6b
Tweaking the sponsor boxes such as putting the title at the bottom.
mrbiggred May 14, 2026
6fcd3ac
Remove chris-cumming from the 2026 sponsors list
mrbiggred May 14, 2026
0effd0e
Remove dead .card-back-* CSS rules and fix misleading comment; the ba…
mrbiggred May 14, 2026
4f734ef
Fix Docker Compose service name in AGENTS.md — use `app` instead of n…
mrbiggred May 14, 2026
2b41fd7
Add keyboard (Enter/Space) handler to sponsor cards — PR #118 review …
mrbiggred May 14, 2026
7616436
Fix sponsor count to use only valid IDs — PR #118 review feedback
mrbiggred May 14, 2026
e80610b
Guard sponsor name placeholder against missing/empty name — PR #118 r…
mrbiggred May 14, 2026
70ddb4e
Moved sponsor images to the assets folder.
mrbiggred May 14, 2026
45f2d7c
Renamed sponsor images.
mrbiggred May 14, 2026
8507a28
Merge branch 'main' into feature/sponsor-page
mrbiggred May 14, 2026
892be30
Merge branch 'main' into feature/sponsor-page
mrbiggred May 14, 2026
9f17b50
Updated documentation for the sponsorship changes.
mrbiggred May 14, 2026
4fa3a3c
Changed sponsor images to webp.
mrbiggred May 14, 2026
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
22 changes: 21 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,28 @@ Weekly Dev Chat website — MkDocs Material static site. Read `mkdocs.yml` and r
- Use `./create_post.sh` to scaffold a new post (calculates next Tuesday automatically).
- **Multiple posts on the same date:** If a date folder already has an `index.md`, prefix the filename with a number and dash (e.g., `0-index.md`). The newest/latest post should use the lowest number so it appears first on the homepage. The original `index.md` keeps its name.

## Sponsors

- Sponsor data lives in `data/sponsors.yml` (loaded via the `mkdocs-macros` plugin). The file's header comment documents the schema and consent policy.
- Sponsor logos go in `docs/assets/sponsors/`. Reference them with just the filename in the `image:` field.
- Optimize logos with `python3 scripts/optimize_image.py <path>` before committing.
- The page itself is `docs/sponsors/index.md`; styles are in `docs/stylesheets/sponsors.css`.

## Guardrails

- Pushing to `main` triggers automatic deployment to production. Do not push without explicit approval.
- Do not modify `.github/workflows/ci.yml` unless explicitly asked.
- Verify changes build cleanly with `mkdocs serve` before committing.
- Verify changes build cleanly with `docker compose run --rm app mkdocs serve` before committing.

## Using Docker Compose

All Python, mkdocs, and similar commands should run via Docker Compose to ensure consistent Python versions:

```bash
docker compose run --rm app <command>

# Examples:
docker compose run --rm app mkdocs serve
docker compose run --rm app mkdocs build
docker compose run --rm app python -m pip list
```
15 changes: 12 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,10 @@ python scripts/find_tags_categories.py

This script requires `pyyaml`, which is included in `requirements.txt`. It is also run automatically by the `create_post` scripts when scaffolding a new post.

## Updating Sponsors

Sponsor and donor entries live in [`data/sponsors.yml`](data/sponsors.yml), which is loaded into the sponsors page via the [`mkdocs-macros`](https://mkdocs-macros-plugin.readthedocs.io/) plugin. The file's header comment documents the schema, consent policy, and how to reference one sponsor across multiple years. Place sponsor logos in `docs/assets/sponsors/` and reference the filename via the `image:` field (e.g. `image: example.png` → `docs/assets/sponsors/example.png`). Optimize logos with `python3 scripts/optimize_image.py` before committing.

## Project Structure

```
Expand All @@ -185,8 +189,11 @@ This script requires `pyyaml`, which is included in `requirements.txt`. It is al
├── requirements-dev.in # Dev-only dependency pins (e.g. Pillow)
├── requirements-dev.txt # Compiled dev dependencies
├── scripts/
│ ├── find_tags_categories.py # List all existing tags and categories
│ |── find_tags_categories.py # List all existing tags and categories
│ |── find_tags_categories.py # List all existing tags and categories
│ └── optimize_image.py # Optimize images for the web (PNG/JPEG → WebP)
├── data/
│ └── sponsors.yml # Sponsor & donor data (consumed by macros plugin)
├── .github/
│ ├── dependabot.yml # Dependabot configuration
│ └── workflows/
Expand All @@ -198,11 +205,13 @@ This script requires `pyyaml`, which is included in `requirements.txt`. It is al
├── tags.md # Tags index page (auto-populated by tags plugin)
├── hosts/ # Current hosts
├── past-hosts/ # Past hosts
├── sponsors/ # Sponsors
├── sponsors/ # Sponsors page (index.md)
├── posts/ # Blog posts (YYYY/MM/DD/)
├── assets/ # Images, logos
│ └── sponsors/ # Sponsor logos (referenced by data/sponsors.yml)
└── stylesheets/
└── extra.css # Custom CSS
├── extra.css # Site-wide custom CSS
└── sponsors.css # Sponsors page styling
```

## Common Commands
Expand Down
73 changes: 73 additions & 0 deletions data/sponsors.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# Sponsors & Donors data for Weekly Dev Chat
#
# Sponsor details are defined once under `sponsors:` and referenced by ID
# in each year under `years:`. This avoids duplicating a sponsor's record
# when they return across multiple years — update their info in one place.
#
# Sponsor fields:
# name (required) Display name.
# image (optional) Filename in docs/sponsors/.
# tier (optional) Short label shown on the card (e.g. "Primary Sponsor").
# description (optional) Short thank-you or description line.
# links (optional) List of { label, url } pairs shown on the card back.
# link (optional, legacy) Single URL — used only if `links` is not set.
# link_label (optional, legacy) Label for the legacy single `link`.
#
# Consent policy: only list individual donors by name with their explicit
# opt-in consent. When in doubt, leave them out or use "Anonymous".
#
# Example (commented out — copy, uncomment, and edit when adding a sponsor):
#
# sponsors:
# example-org:
# name: Example Org
# image: example.png
# tier: Community Partner
# description: Thanks to Example Org for supporting the community.
# links:
# - label: Website
# url: https://example.com/

sponsors:
saturday-mp:
name: Saturday Morning Productions
image: saturday-morning-productions.jpeg
tier: Primary Sponsor
description: Main financial sponsor.
links:
- label: Website
url: https://saturdaymp.com/
- label: GitHub Sponsors
url: https://github.com/sponsors/saturdaymp

dev-edmonton:
name: Dev Edmonton Society
image: dev-edmonton.png
tier: Community Partner
description: Slack workspace and other promotional support.
links:
- label: Website
url: https://devedmonton.com/

edmonton-unlimited:
name: Edmonton Unlimited
image: edmonton-unlimited.jpeg
tier: Community Partner
description: Meetup group and other promotional support.

links:
- label: Website
url: https://edmontonunlimited.com/
- label: Meetup
url: https://www.meetup.com/Edmonton-Unlimited/

years:
2026:
- saturday-mp
- dev-edmonton
- edmonton-unlimited

2025:
- saturday-mp
- dev-edmonton
- edmonton-unlimited
File renamed without changes
File renamed without changes
Binary file removed docs/posts/2026/05/05/github.png
Binary file not shown.
Binary file added docs/posts/2026/05/05/github.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion docs/posts/2026/05/05/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@ Others have commented on their [recent decline](https://dbushell.com/2026/04/29/

Everyone and anyone are welcome to [join](https://weeklydevchat.com/join/) as long as you are kind, supportive, and respectful of others. Zoom link will be posted at 12pm MDT.

![alt text](github.png)
![alt text](github.webp)
141 changes: 120 additions & 21 deletions docs/sponsors/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,132 @@
hide:
- toc
---
# Help and Sponsorship
# Sponsors

The best way you can help the Weekly Dev Chat is to attend the events as the kind, supportive, and respectful person you are. A close second is to share the Weekly Dev Chat with others who might benefit.
<div class="wdc-sponsors-page" markdown>
<p class="lead">The Weekly Dev Chat is powered by community members like you!</p>
<section class="support">
<div class="support-card">
<h3>Show Up</h3>
<p>Attending events is the best way to support the Weekly Dev Chat. Bring your curiosity and be willing to share your knowledge and learn from others.</p>
</div>
<div class="support-card">
<h3>Spread the Word</h3>
<p>Invite others who follow our values to an event. Everyone and anyone is welcome as long as they are kind, supportive, and respectful of others.</p>
</div>
<div class="support-card">
<h3>Sponsor</h3>
<p>Help keep the lights on and get things done with contributions of money, time, skills, or other resources. Every little bit helps.</p>
</div>
</section>

We also need volunteers to help with a variety of tasks from helping with events, admin work, website maintenance, social media, etc. If you are interested in volunteering, please reach out to Chris via email at <chris.cumming@saturdaymp.com>.
<section class="become-sponsor">
<div class="eyebrow"><span class="dot"></span> Want on this page?</div>
<div class="become-inner">
<div>
<h3>Thank you to our Current and Past Sponsors!</h3>
<p>Email us if you have any questions or would like to make non-financial contributions.</p>
</div>
<div class="become-ctas">
<a class="btn primary" href="https://buy.stripe.com/dRmaEY4HJ2xUgcG8PdfIs01">Sponsor</a>
<a class="btn primary" href="mailto:chris@weeklydevchat.com">Email</a>
</div>
</div>
</section>

The final way you can help is by sponsoring SaturdayMP, the main Weekly Dev Chat sponsor, via GitHub [sponsors](https://github.com/sponsors/saturdaymp). Saturday MP pays for Zoom, hosting, food for in real life (IRL) events, and other expenses.
{% for year in sponsors.years.keys() | sort(reverse=true) %}
{% set valid_ids = (sponsors.years[year] or []) | select('in', sponsors.sponsors) | list %}
<section class="year-group" data-year="{{ year }}">
<div class="year-header">
<h2 class="year-num" id="year-{{ year }}">{{ year }}</h2>
<span class="year-meta">{{ valid_ids|length }} sponsor{{ '' if valid_ids|length == 1 else 's' }} (click/tap for info)</span>
<div class="year-rule"></div>
</div>
<div class="sponsor-grid">
{% for id in valid_ids %}
{% set s = sponsors.sponsors[id] %}
{% set card_links = s.links if s.links else ([{'label': s.link_label or 'Website', 'url': s.link}] if s.link else []) %}
Comment thread
mrbiggred marked this conversation as resolved.
<div class="sponsor-card" role="button" tabindex="0">
<div class="card-face card-front">
<div class="card-logo">
{% if s.image %}<img src="../assets/sponsors/{{ s.image }}" alt="{{ s.name }}">{% else %}<div class="card-logo-placeholder">{{ (s.name or 'Anonymous')[0] }}</div>{% endif %}
</div>
Comment thread
mrbiggred marked this conversation as resolved.
<div class="card-footer">
<span class="card-tier">{{ s.name or 'Sponsor' }}</span>
</div>
</div>
<div class="card-face card-back">
<div class="card-back-inner">
{% if s.tier %}<div class="card-back-tier">{{ s.tier }}</div>{% endif %}
<h4 class="card-back-name">{{ s.name }}</h4>
{% if s.description %}<p class="card-back-desc">{{ s.description }}</p>{% endif %}
{% if card_links %}
<div class="card-back-links">
{% for l in card_links %}
<a href="{{ l.url }}" target="_blank" rel="noopener">{{ l.label }} <span class="arrow">↗</span></a>
{% endfor %}
</div>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>
</section>
{% endfor %}

If you have any other ideas for helping Weekly Dev Chat please give [Chris](mailto:chris.cumming@saturdaymp.com) a shout. Thank you for your help and support, it is much appreciated.
<dialog id="wdc-sponsor-modal">
<div class="wdc-sponsor-modal-inner">
<button class="wdc-sponsor-modal-close" aria-label="Close">&#x2715;</button>
<div class="wdc-sponsor-modal-tier"></div>
<h3 class="wdc-sponsor-modal-name"></h3>
<p class="wdc-sponsor-modal-desc"></p>
<div class="wdc-sponsor-modal-links"></div>
</div>
</dialog>

Sponsors
--------
</div>

![](smp.webp){: style="width:150px;float: left;padding-right: 10px;"}
<script>
(function () {
var modal = document.getElementById('wdc-sponsor-modal');
if (!modal) return;
var mTier = modal.querySelector('.wdc-sponsor-modal-tier');
var mName = modal.querySelector('.wdc-sponsor-modal-name');
var mDesc = modal.querySelector('.wdc-sponsor-modal-desc');
var mLinks = modal.querySelector('.wdc-sponsor-modal-links');
var mClose = modal.querySelector('.wdc-sponsor-modal-close');

**Saturday Morning Productions**
function openModal(card) {
var tier = card.querySelector('.card-back-tier');
var name = card.querySelector('.card-back-name');
var desc = card.querySelector('.card-back-desc');
var links = card.querySelector('.card-back-links');
mTier.textContent = tier ? tier.textContent.trim() : '';
mTier.hidden = !tier;
mName.textContent = name ? name.textContent.trim() : '';
mDesc.textContent = desc ? desc.textContent.trim() : '';
mDesc.hidden = !desc;
mLinks.innerHTML = links ? links.innerHTML : '';
mLinks.hidden = !links;
modal.showModal();
}

Thanks to [Saturday MP](https://saturdaymp.com/) for providing hosting, Zoom, and more.
document.querySelectorAll('.wdc-sponsors-page .sponsor-card').forEach(function (card) {
card.addEventListener('click', function () {
card.blur();
openModal(card);
});
card.addEventListener('keydown', function (e) {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
card.blur();
openModal(card);
}
});
});

![](devEd.webp){: style="width:150px;float: left;padding-right: 10px;"}

**Dev Edmonton Society**

Thanks to [DES](https://devedmonton.com/) for providing a Slack channel.

![](EdmontonUnlimited.webp){: style="width:150px;float: left;padding-right: 10px;"}

**Edmonton Unlimited**

Thanks to [Edmonton Unlimited](https://edmontonunlimited.com/) for providing a [Meetup Link](https://edmontonunlimited.com/).
mClose.addEventListener('click', function () { modal.close(); });
modal.addEventListener('click', function (e) { if (e.target === modal) modal.close(); });
})();
</script>
Binary file removed docs/sponsors/logo_ZM_wordmark_bloom.webp
Binary file not shown.
12 changes: 11 additions & 1 deletion docs/stylesheets/extra.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
.md-typeset h1 {
font-weight: 300;
font-size: clamp(32px, 4.5vw, 48px);
letter-spacing: -0.02em;
line-height: 1.1;
color: var(--md-primary-fg-color, #009688);
border-bottom: none;
padding-bottom: 0;
}

.logo-article-img {
width: 300px;
margin-left: 20px;
Expand All @@ -8,4 +18,4 @@
float: right;
margin-left: 10px;
}
}
}
Loading
Loading