Skip to content

feat(works): public Related Works registry with moderated issue-form submissions - #22

Merged
erinepshovel-code merged 4 commits into
mainfrom
claude/textbook-chapters-needed-jd2nht
Jul 29, 2026
Merged

erinepshovel-code merged 4 commits into
mainfrom
claude/textbook-chapters-needed-jd2nht

Conversation

@erinepshovel-code

@erinepshovel-code erinepshovel-code commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Gives others a way to add works related to The Interdependent Way, displayed on the site but never hosted by it — with the maintainer as the moderation gate and zero new infrastructure. Same architecture as the canon/textbook fetchers: public submissions land as structured GitHub issues, approval is a label, the static build fetches metadata and renders.

Display, not host. Works appear inline on /works/ — images, audio, PDFs, and video/audio embeds — but the visitor's browser loads every byte directly from the creator's own hosting at view time. The site stores only submitted metadata and the pointer; no copies are ever made or served. Works without a display source list as metadata plus an outbound link.

Flow

  1. Visitor opens the issue form (.github/ISSUE_TEMPLATE/related-work.yml): title, creator, https link, type, relation, description, optional display source (direct image/audio/PDF file URL, or an embed URL from the allowlisted hosts: YouTube, Vimeo, Bandcamp, SoundCloud, archive.org), optional license, and a rights/responsibility consent checkbox. Auto-labels related-work. Email fallback for non-GitHub submitters.
  2. Maintainer adds approved to publish; removing a label delists. Labels are the single switch.
  3. scripts/fetch-works.mjs (in refresh:data + prepare-tests) fetches doubly-labeled issues, parses issue-form bodies, validates fail-closed (https-only; display sources must derive to image/audio/pdf or an allowlisted iframe host — IFRAME_EMBED_HOSTS is a deliberate, documented allowlist since each entry means third-party script on the page). Invalid-but-approved submissions surface as visible gaps. OFFLINE=1 uses the last-known-good snapshot.
  4. /works/ renders inline displays (lazy, no-referrer, sandboxed iframes) with a per-work "displayed from the creator's own hosting" note, attribution, issue provenance, submission instructions, takedown contact (delisting on next build; no copy remains because none was made), and the boundary: listing is moderation, not review — no endorsement, no status transfer, canon and research ledgers untouched.

Testing: npm test — 25 passed (5 new: parser, validator, display derivation, moderation gating, dataset schema). Direct Eleventy render verified.

Post-merge manual step: create the approved label (the related-work label auto-creates on first submission).

🤖 Generated with Claude Code

https://claude.ai/code/session_01E93Rxmrs8bXHtWjD7z94bi

claude added 4 commits July 29, 2026 12:04
…submissions

Others can now add works engaging The Interdependent Way:

- .github/ISSUE_TEMPLATE/related-work.yml — structured public submission form
  (title, creator, https link, type, relation, description, rights consent);
  applies the related-work label.
- scripts/fetch-works.mjs — build-time fetch of issues carrying both
  related-work and approved labels from this repo via the allowlisted GitHub
  API; parses issue-form bodies, validates fail-closed with visible
  exclusions, writes generated/works.json plus a last-known-good snapshot;
  OFFLINE=1 uses the snapshot. Moderation is the label pair: add approved to
  publish, remove to delist.
- /works/ page — registry with attribution, per-work issue provenance, the
  no-endorsement/no-status-transfer boundary, submission instructions (issue
  form + email fallback), and visible gaps for approved-but-invalid entries.
- Nav link, refresh:works wired into refresh:data and prepare-tests,
  docs/related-works.md, and tests/works-registry.test.mjs (parser,
  validator, moderation gating, generated-dataset schema).

npm test: 24 passed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E93Rxmrs8bXHtWjD7z94bi
The registry displays bibliographic metadata and outbound links only; it never
stores, copies, or embeds submitted works. States this on the /works/ page with
a takedown contact, in the issue form intro, and in the strengthened
rights/responsibility consent checkbox; docs/related-works.md records the hard
rules (no uploads, no mirrors, no embeds) and the label-based takedown flow.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E93Rxmrs8bXHtWjD7z94bi
…never copies

Corrects the posture: works ARE displayed on the page (image, audio, PDF, and
allowlisted video/audio embeds), with the visitor's browser loading them
directly from the creator's own hosting at view time. The site stores only
metadata and the pointer — no copies, ever. Optional 'Display source' field on
the submission form; fail-closed derivation (https-only; direct file
extensions or the deliberate IFRAME_EMBED_HOSTS allowlist); works without a
valid display source list as metadata + link. Boundary text, docs, and tests
updated (25 pass).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E93Rxmrs8bXHtWjD7z94bi
29 hosts grouped by medium — video (YouTube, Vimeo, Dailymotion, Twitch,
Rumble, Odysee, Streamable, Loom, TED), audio/music/podcasts (SoundCloud,
Bandcamp, Spotify, Apple Music/Podcasts, Mixcloud, Audiomack, Podbean),
documents/archives/slides (archive.org, Google Docs, OneDrive, Issuu, Scribd,
SlideShare), code/interactive/3D (CodePen, CodeSandbox, JSFiddle, itch.io,
Sketchfab). Submitters can request missing platforms in their submission;
adding one is a one-line reviewed change. 25 tests pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E93Rxmrs8bXHtWjD7z94bi
@erinepshovel-code
erinepshovel-code marked this pull request as ready for review July 29, 2026 12:31
@erinepshovel-code
erinepshovel-code merged commit 38d1c02 into main Jul 29, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants