From 96276787f35606dae595e267986cacdb48d8c2ee Mon Sep 17 00:00:00 2001 From: vincent Date: Mon, 29 Jun 2026 13:50:12 -0400 Subject: [PATCH 1/5] Remove Vincent from people page Vincent Charlebois has resigned; remove avatar and bio entry. Co-Authored-By: Claude Opus 4.8 --- _people/Vincent.md | 9 --------- assets/images/avatars/Vincent.png | Bin 30850 -> 0 bytes 2 files changed, 9 deletions(-) delete mode 100644 _people/Vincent.md delete mode 100644 assets/images/avatars/Vincent.png diff --git a/_people/Vincent.md b/_people/Vincent.md deleted file mode 100644 index e2e01d5b..00000000 --- a/_people/Vincent.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -name: 'Vincent Charlebois' -pronouns: '(he/him)' -avatar: Vincent.png ---- -Vincent Charlebois is an artist-researcher and creative technologist who believes in the power of exploring multiplicity to inform understanding. - - -After earning his BFA in intermedia arts, working in reforestation planting over a million trees, and solidifying his technical skill set at architecture school in Barcelona, he landed in Digital Initiatives at the McGill University Library. There, he deepened his passion for sharing knowledge and exploring emerging technologies. This passion led him to Hypha, where he now helps clients manage how their communities interact with technology while he continues his research on sustainable interactions between nature and tech through art. \ No newline at end of file diff --git a/assets/images/avatars/Vincent.png b/assets/images/avatars/Vincent.png deleted file mode 100644 index efb2f11d76c17672c80800ab227dd27147044073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30850 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 Zop*`Sl8?!kfa0_S+7BM7m#SKa{~za=lb!$o From 35d88aba2fd3e12e1d6772000659000485cfc154 Mon Sep 17 00:00:00 2001 From: vincent Date: Thu, 9 Jul 2026 12:06:16 -0400 Subject: [PATCH 2/5] Batch gem bumps, html-proofer 5.x migration, dependabot CI fix Supersedes the open dependabot PRs, which all fail CI because dependabot-triggered runs don't receive repository secrets, leaving /tmp/secret.key empty and crashing jekyll-activity-pub (OpenSSL::PKey::RSAError). - Bump nokogiri 1.19.4, jekyll-activity-pub 0.3.6, webrick 1.9.2, sutty-liquid 0.13.0, html-proofer 5.2.1, addressable 2.9.0, httparty 0.24.2, rexml 3.4.4 (plus transitive updates incl. distributed-press-api-client 0.5.4) - Migrate `make check` to html-proofer 5.x flags (--check-html removed, --disable_external renamed, --internal-domains replaced by --swap-urls) - deploy.yml: fall back to a throwaway RSA key when the ActivityPub key secret is unavailable, so dependabot PR builds can pass; publish steps still run only on push events, which have real secrets Verified locally: JEKYLL_ENV=staging make build and make check both pass with the updated lockfile. Co-Authored-By: Claude Fable 5 --- .github/workflows/deploy.yml | 19 ++++- Gemfile | 2 +- Gemfile.lock | 154 +++++++++++++++++++++-------------- Makefile | 9 +- 4 files changed, 115 insertions(+), 69 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 0ec16040..63da7385 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -68,18 +68,31 @@ jobs: sed -i 's|url: "https://social.dp.chanterelle.xyz"|url: "${{ vars.SOCIAL_DP_STAGING }}"|' _config.yml fi - # Decode the correct key based on the branch + # Decode the correct key based on the branch. + # Dependabot-triggered PR runs don't receive repository secrets, so fall + # back to a throwaway key — it's only used to build; publishing only + # happens on push events, which always have the real secrets. - name: Decode Staging Key if: > github.ref == 'refs/heads/staging' || (github.event_name == 'pull_request' && github.base_ref == 'staging') - run: echo ${{ secrets.ENCODED_DP_AP_KEY_STAGING }} | base64 --decode > /tmp/secret.key + run: | + if [ -n "${{ secrets.ENCODED_DP_AP_KEY_STAGING }}" ]; then + echo ${{ secrets.ENCODED_DP_AP_KEY_STAGING }} | base64 --decode > /tmp/secret.key + else + openssl genrsa -out /tmp/secret.key 2048 + fi - name: Decode Production Key if: > github.ref == 'refs/heads/master' || (github.event_name == 'pull_request' && github.base_ref == 'master') - run: echo ${{ secrets.ENCODED_DP_AP_KEY_PRODUCTION }} | base64 --decode > /tmp/secret.key + run: | + if [ -n "${{ secrets.ENCODED_DP_AP_KEY_PRODUCTION }}" ]; then + echo ${{ secrets.ENCODED_DP_AP_KEY_PRODUCTION }} | base64 --decode > /tmp/secret.key + else + openssl genrsa -out /tmp/secret.key 2048 + fi - name: Build Jekyll Site for Staging if: github.ref == 'refs/heads/staging' || (github.event_name == 'pull_request' && github.base_ref == 'staging') diff --git a/Gemfile b/Gemfile index cf95c1be..747be833 100644 --- a/Gemfile +++ b/Gemfile @@ -14,7 +14,7 @@ gem "html-proofer" gem 'nokogiri' # gem 'ruby-brs' gem "webrick", "~> 1.9" -gem 'sutty-liquid', '~> 0.12.2' +gem 'sutty-liquid', '~> 0.13.0' group :jekyll_plugins do gem "jekyll-feed", diff --git a/Gemfile.lock b/Gemfile.lock index ad6131d7..d52f8477 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -9,16 +9,29 @@ GIT GEM remote: https://rubygems.org/ specs: - addressable (2.8.7) - public_suffix (>= 2.0.2, < 7.0) - base64 (0.2.0) - bigdecimal (3.1.9) + Ascii85 (2.0.1) + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) + afm (1.0.0) + async (2.42.0) + console (~> 1.29) + fiber-annotation + io-event (~> 1.11) + metrics (~> 0.12) + traces (~> 0.18) + base64 (0.3.0) + benchmark (0.5.0) + bigdecimal (3.3.1) climate_control (1.2.0) colorator (1.1.0) - concurrent-ruby (1.3.5) - crass (1.0.6) - csv (3.3.0) - distributed-press-api-client (0.5.1) + concurrent-ruby (1.3.7) + console (1.36.0) + fiber-annotation + fiber-local (~> 1.1) + json + crass (1.0.7) + csv (3.3.5) + distributed-press-api-client (0.5.4) addressable (~> 2.3, >= 2.3.0) climate_control dry-schema @@ -27,28 +40,30 @@ GEM json (~> 2.1, >= 2.1.0) jwt (~> 2.6.0) nokogiri (~> 1.16) - dry-configurable (1.2.0) - dry-core (~> 1.0, < 2) + dry-configurable (1.4.0) + dry-core (~> 1.0) zeitwerk (~> 2.6) - dry-core (1.0.1) + dry-core (1.2.0) concurrent-ruby (~> 1.0) + logger zeitwerk (~> 2.6) - dry-inflector (1.1.0) - dry-initializer (3.1.1) - dry-logic (1.5.0) + dry-inflector (1.3.1) + dry-initializer (3.2.0) + dry-logic (1.6.0) + bigdecimal concurrent-ruby (~> 1.0) - dry-core (~> 1.0, < 2) + dry-core (~> 1.1) zeitwerk (~> 2.6) - dry-schema (1.13.4) + dry-schema (1.16.0) concurrent-ruby (~> 1.0) dry-configurable (~> 1.0, >= 1.0.1) - dry-core (~> 1.0, < 2) - dry-initializer (~> 3.0) - dry-logic (>= 1.4, < 2) - dry-types (>= 1.7, < 2) + dry-core (~> 1.1) + dry-initializer (~> 3.2) + dry-logic (~> 1.6) + dry-types (~> 1.9, >= 1.9.1) zeitwerk (~> 2.6) - dry-types (1.7.2) - bigdecimal (~> 3.0) + dry-types (1.9.1) + bigdecimal (>= 3.0) concurrent-ruby (~> 1.0) dry-core (~> 1.0) dry-inflector (~> 1.0) @@ -61,32 +76,40 @@ GEM ffi (>= 1.15.0) eventmachine (1.2.7) fast_blank (1.0.1) - ffi (1.17.1-x86_64-darwin) - ffi (1.17.1-x86_64-linux-gnu) + ffi (1.17.4-x86_64-darwin) + ffi (1.17.4-x86_64-linux-gnu) + fiber-annotation (0.2.0) + fiber-local (1.1.0) + fiber-storage + fiber-storage (1.0.1) forwardable-extended (2.6.0) - google-protobuf (4.29.3-x86_64-darwin) + google-protobuf (4.35.1-x86_64-darwin) bigdecimal - rake (>= 13) - google-protobuf (4.29.3-x86_64-linux) + rake (~> 13.3) + google-protobuf (4.35.1-x86_64-linux-gnu) bigdecimal - rake (>= 13) - html-proofer (3.19.4) + rake (~> 13.3) + hashery (2.1.2) + html-proofer (5.2.1) addressable (~> 2.3) - mercenary (~> 0.3) + async (~> 2.1) + benchmark (~> 0.5) nokogiri (~> 1.13) - parallel (~> 1.10) + pdf-reader (~> 2.11) rainbow (~> 3.0) typhoeus (~> 1.3) yell (~> 2.0) - http_parser.rb (0.8.0) - httparty (0.22.0) + zeitwerk (~> 2.5) + http_parser.rb (0.8.1) + httparty (0.24.2) csv mini_mime (>= 1.0.0) multi_xml (>= 0.5.2) httparty-cache (0.0.6) httparty (~> 0.18) - i18n (1.14.7) + i18n (1.15.2) concurrent-ruby (~> 1.0) + io-event (1.19.1) jekyll (4.4.1) addressable (~> 2.4) base64 (~> 0.2) @@ -106,69 +129,80 @@ GEM safe_yaml (~> 1.0) terminal-table (>= 1.8, < 4.0) webrick (~> 1.7) - jekyll-activity-pub (0.3.3) + jekyll-activity-pub (0.3.6) distributed-press-api-client (~> 0.5.0) jekyll (~> 4) marcel (~> 1) - jekyll-sass-converter (3.0.0) - sass-embedded (~> 1.54) + jekyll-sass-converter (3.1.0) + sass-embedded (~> 1.75) jekyll-watch (2.2.1) listen (~> 3.0) - json (2.7.2) + json (2.20.0) jwt (2.6.0) - kramdown (2.5.1) - rexml (>= 3.3.9) + kramdown (2.5.2) + rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) liquid (4.0.4) - listen (3.9.0) + listen (3.10.0) + logger rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) logger (1.7.0) - loofah (2.24.0) + loofah (2.25.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) - marcel (1.0.4) + marcel (1.2.1) mercenary (0.4.0) + metrics (0.15.0) mini_mime (1.1.5) - multi_xml (0.7.1) - bigdecimal (~> 3.1) - nokogiri (1.18.7-x86_64-darwin) + multi_xml (0.9.1) + bigdecimal (>= 3.1, < 5) + nokogiri (1.19.4-x86_64-darwin) racc (~> 1.4) - nokogiri (1.18.7-x86_64-linux-gnu) + nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) - parallel (1.22.1) pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (6.0.1) + pdf-reader (2.15.1) + Ascii85 (>= 1.0, < 3.0, != 2.0.0) + afm (>= 0.2.1, < 2) + hashery (~> 2.0) + ruby-rc4 + ttfunk + public_suffix (7.0.5) racc (1.8.1) rails-html-sanitizer (1.6.2) loofah (~> 2.21) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) rainbow (3.1.1) - rake (13.2.1) + rake (13.4.2) rb-fsevent (0.11.2) rb-inotify (0.11.1) ffi (~> 1.0) - rexml (3.4.0) - rouge (4.5.1) + rexml (3.4.4) + rouge (4.7.0) + ruby-rc4 (0.1.5) safe_yaml (1.0.5) - sass-embedded (1.83.4-x86_64-darwin) - google-protobuf (~> 4.29) - sass-embedded (1.83.4-x86_64-linux-gnu) - google-protobuf (~> 4.29) - sutty-liquid (0.12.3) + sass-embedded (1.101.0-x86_64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.101.0-x86_64-linux-gnu) + google-protobuf (~> 4.31) + sutty-liquid (0.13.0) fast_blank (~> 1.0) jekyll (~> 4) rails-html-sanitizer (~> 1.6.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) + traces (0.18.2) + ttfunk (1.8.0) + bigdecimal (~> 3.1) typhoeus (1.4.0) ethon (>= 0.9.0) unicode-display_width (2.6.0) - webrick (1.9.1) + webrick (1.9.2) yell (2.2.2) - zeitwerk (2.6.17) + zeitwerk (2.8.2) PLATFORMS x86_64-darwin-20 @@ -181,7 +215,7 @@ DEPENDENCIES jekyll-feed! logger nokogiri - sutty-liquid (~> 0.12.2) + sutty-liquid (~> 0.13.0) webrick (~> 1.9) BUNDLED WITH diff --git a/Makefile b/Makefile index 76ef4ec3..c58f01b4 100644 --- a/Makefile +++ b/Makefile @@ -3,13 +3,12 @@ RUN = bundle exec start: ## Run jekyll server $(RUN) jekyll serve --watch -check: ## Check with htmlproofer +check: ## Check with htmlproofer (5.x flags: --check-html removed, --internal-domains replaced by --swap-urls) $(RUN) htmlproofer ./_site \ - --check-html \ --allow-hash-href \ - --disable_external \ - --typhoeus-config '{ "headers": { "User-Agent": "Mozilla/5.0 (X11; Linux i686; rv:84.0) Gecko/20100101 Firefox/84.0" } }' \ - --internal-domains hypha.coop + --disable-external \ + --no-enforce-https \ + --swap-urls "https\://hypha.coop:,https\://staging.hypha.coop:" build: ## Build for web @if [ "$(JEKYLL_ENV)" = "staging" ]; then \ From 77d67fc8b761a741beabe0e6705f5a2660da8610 Mon Sep 17 00:00:00 2001 From: vincent Date: Thu, 9 Jul 2026 12:10:13 -0400 Subject: [PATCH 3/5] Allow empty hrefs in htmlproofer check The all-relative post-processing step rewrites href="/" to href="" on pages at the site root; html-proofer 5.x flags empty hrefs as missing references (3.x did not). Co-Authored-By: Claude Fable 5 --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index c58f01b4..22998d03 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,7 @@ start: ## Run jekyll server check: ## Check with htmlproofer (5.x flags: --check-html removed, --internal-domains replaced by --swap-urls) $(RUN) htmlproofer ./_site \ --allow-hash-href \ + --allow-missing-href \ --disable-external \ --no-enforce-https \ --swap-urls "https\://hypha.coop:,https\://staging.hypha.coop:" From c99dad19b249d95fd5d12e1d4a3c4d470d94aca9 Mon Sep 17 00:00:00 2001 From: vincent Date: Thu, 9 Jul 2026 12:16:56 -0400 Subject: [PATCH 4/5] Omit empty tag in picture include site.data.theme.pixel_densities doesn't exist, so the srcset loop always rendered srcset="". html-proofer 5.x checks elements (3.x didn't) and fails fediverse comment embeds, which only appear in CI builds where the real ActivityPub key can fetch replies. Co-Authored-By: Claude Fable 5 --- _includes/picture.html | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/_includes/picture.html b/_includes/picture.html index eeceb073..60ba1d8a 100644 --- a/_includes/picture.html +++ b/_includes/picture.html @@ -10,18 +10,21 @@ @param :img_class [String] {%- endcomment -%} +{%- capture srcset -%} + {%- for pixel_density in site.data.theme.pixel_densities %} + {% if include.width %} + {%- assign w = include.width | times: pixel_density -%} + {% elsif include.height %} + {%- assign h = include.height | times: pixel_density -%} + {% endif %} + {{- include.src | thumbnail: w, h | uri_escape }} {{ pixel_density }}x, + {% endfor -%} +{%- endcapture -%} +{%- assign srcset = srcset | strip -%} - + {%- if srcset != "" %} + + {%- endif %} Date: Thu, 9 Jul 2026 12:35:27 -0400 Subject: [PATCH 5/5] Scope throwaway-key fallback to PRs; make notify/commit-back push-only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review feedback: the empty-secret fallback must not let a push build deploy with a dummy key — fail hard instead. Also stop running jekyll notify and the data commit-back on PRs targeting master; those are side effects that should only happen after merge. Co-Authored-By: Claude Fable 5 --- .github/workflows/deploy.yml | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 63da7385..33df9c51 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -69,9 +69,10 @@ jobs: fi # Decode the correct key based on the branch. - # Dependabot-triggered PR runs don't receive repository secrets, so fall - # back to a throwaway key — it's only used to build; publishing only - # happens on push events, which always have the real secrets. + # Dependabot- and fork-triggered PR runs don't receive repository + # secrets, so PR builds fall back to a throwaway key — it's only used to + # build, never to publish. Push builds must have the real secret and + # fail hard if it's missing. - name: Decode Staging Key if: > github.ref == 'refs/heads/staging' || @@ -79,8 +80,11 @@ jobs: run: | if [ -n "${{ secrets.ENCODED_DP_AP_KEY_STAGING }}" ]; then echo ${{ secrets.ENCODED_DP_AP_KEY_STAGING }} | base64 --decode > /tmp/secret.key - else + elif [ "${{ github.event_name }}" = "pull_request" ]; then openssl genrsa -out /tmp/secret.key 2048 + else + echo "ENCODED_DP_AP_KEY_STAGING is empty on a push build; refusing to deploy with a throwaway key" >&2 + exit 1 fi - name: Decode Production Key @@ -90,8 +94,11 @@ jobs: run: | if [ -n "${{ secrets.ENCODED_DP_AP_KEY_PRODUCTION }}" ]; then echo ${{ secrets.ENCODED_DP_AP_KEY_PRODUCTION }} | base64 --decode > /tmp/secret.key - else + elif [ "${{ github.event_name }}" = "pull_request" ]; then openssl genrsa -out /tmp/secret.key 2048 + else + echo "ENCODED_DP_AP_KEY_PRODUCTION is empty on a push build; refusing to deploy with a throwaway key" >&2 + exit 1 fi - name: Build Jekyll Site for Staging @@ -129,12 +136,14 @@ jobs: refresh_token: ${{ secrets.DISTRIBUTED_PRESS_PRODUCTION_TOKEN}} site_url: hypha.coop + # Push-only: notifying the Fediverse and committing generated data are + # side effects that must not run for unmerged PRs targeting master. - name: Notify AP - if: github.ref == 'refs/heads/master' || (github.event_name == 'pull_request' && github.base_ref == 'master') + if: github.event_name == 'push' && github.ref == 'refs/heads/master' run: bundle exec jekyll notify --key /tmp/secret.key --verbose --trace - name: Commit ActivityPub and Sequoia Data - if: github.ref == 'refs/heads/master' || (github.event_name == 'pull_request' && github.base_ref == 'master') + if: github.event_name == 'push' && github.ref == 'refs/heads/master' uses: EndBug/add-and-commit@v9 with: add: '_data/activity_pub.yml,.sequoia-state.json,_posts'