From 1c8daf01dfb6590bb2ffc5f9f9e2cd3a41618c11 Mon Sep 17 00:00:00 2001 From: Eric Meehan Date: Sat, 31 Oct 2026 15:11:21 -0400 Subject: [PATCH] Focus on content --- README.md | 87 +++ htdocs/common/footer.html | 8 +- htdocs/common/header.html | 12 +- htdocs/common/topnav.html | 10 +- htdocs/index.html | 311 +++++++--- htdocs/static/gitea-projects.mjs | 287 +++++++++ htdocs/static/home.css | 190 +++++- htdocs/static/peertube-feeds.mjs | 420 +++++++++++++ .../Microsoft/Windows/Caches/cversions.2.db | Bin 0 -> 16384 bytes ...C-3716689AF493}.2.ver0x0000000000000001.db | Bin 0 -> 308840 bytes ...8-1A9A39C3FDA2}.2.ver0x0000000000000001.db | Bin 0 -> 662488 bytes .../members/tests/test_service_groups.py | 18 +- membership/templates/members.html | 35 +- scripts/preview.mjs | 174 ++++++ tests/gitea-projects.test.mjs | 560 +++++++++++++++++ tests/peertube-feeds.test.mjs | 579 ++++++++++++++++++ tests/site.test.mjs | 431 +++++++++++++ 17 files changed, 3003 insertions(+), 119 deletions(-) create mode 100755 htdocs/static/gitea-projects.mjs create mode 100755 htdocs/static/peertube-feeds.mjs create mode 100755 membership/%SystemDrive%/ProgramData/Microsoft/Windows/Caches/cversions.2.db create mode 100755 membership/%SystemDrive%/ProgramData/Microsoft/Windows/Caches/{6AF0698E-D558-4F6E-9B3C-3716689AF493}.2.ver0x0000000000000001.db create mode 100755 membership/%SystemDrive%/ProgramData/Microsoft/Windows/Caches/{DDF571F2-BE98-426D-8288-1A9A39C3FDA2}.2.ver0x0000000000000001.db create mode 100755 scripts/preview.mjs create mode 100755 tests/gitea-projects.test.mjs create mode 100755 tests/peertube-feeds.test.mjs create mode 100755 tests/site.test.mjs diff --git a/README.md b/README.md index 248b7c9..e91479c 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,93 @@ public accounts, Dex sign-in, and Stripe membership under **/members/**. Optional SHKeeper support adds prepaid crypto membership alongside Stripe. Both payment methods feed the same LDAP group reconciliation and local expiry. +## Creative direction + +eom.dev is Eric Meehan's independent home for music, films about travel and +public performances, and creative engineering. The homepage leads with the +work, not an offer to install or manage other people's self-hosted services. +Open-source software and decentralized publishing are its foundation; educational +content and source code remain available so others can build their own spaces. + +The homepage's main paths are **Films**, **Music**, **Workshop**, and **Gaming**. +Gaming has its own game/server cards and latest uploads, separate from the +engineering feed. Writing on Discourse is linked in the community band and footer. +Wikideck is listed with the games; Luanti remains the first gaming card. +Featured +recordings link directly to existing PeerTube publications and credit the +performers. The latest uploads are loaded from the public PeerTube API; selected +static recordings remain as a clearly labeled fallback when live requests fail. +Community services, free registration, existing games, and membership benefits +remain available. Support funds the creative work and independent publishing, +without promising managed hosting, consulting, or a fixed release schedule. +Membership pricing, billing, and access rules are unchanged. + +Edit [htdocs/index.html](htdocs/index.html) for the work and featured recordings, +[htdocs/common/header.html](htdocs/common/header.html) for search/social metadata, +and [htdocs/common/topnav.html](htdocs/common/topnav.html) for navigation. +The responsive Catppuccin styling lives in +[htdocs/static/home.css](htdocs/static/home.css); membership introduction copy +lives in [membership/templates/members.html](membership/templates/members.html). + +### Automatic publications + +The **My projects** cards use +[htdocs/static/gitea-projects.mjs](htdocs/static/gitea-projects.mjs) to read Eric's +anonymous public activity feed on Gitea, rather than an owned-repository list or +site-wide search. This captures contributions across organizations. It selects +the three most recently pushed distinct repositories by activity timestamp, +scanning up to 15 pages of 10 recent events and stopping once three projects are +found. Small pages keep requests lighter. It is a bounded recent-work view, +not an exhaustive project catalog or a claim of repository ownership. + +Only Eric's explicitly public push events and public repositories qualify. +Cards show the organization/repository name, description, public push date, +and a commit summary/link when available. Titles and summaries are plain text; +email addresses and other author metadata are not displayed. Gitea requests are +anonymous, HTTPS-only, size-limited to 2 MiB, and time out after 10 seconds. +The cards refresh every 15 minutes while visible, retain clearly labeled +fallback/previous content on failure, and link to the full public activity page. +No Creator Launch project or service offer is involved. + +[htdocs/static/peertube-feeds.mjs](htdocs/static/peertube-feeds.mjs) loads public +JSON from https://peertube.eom.dev without cookies or API keys. Channel sections +request their three newest videos, sorted by publication date: personal/travel +channel `eric_channel`, music `eric_music`, engineering `eric_tech`, and +gaming `eric_gaming`, each in its own section. Their names are +configured in each homepage section's `data-channels` attribute. Newly created +channels appear in the collection browser automatically; placing one in a +themed homepage section requires updating that section's names. Channel API +routes use names, not the numeric IDs accepted by RSS feed selectors. + +The collection browser discovers Eric's public channels and playlists using +the account API. It defaults to **Originals**, preserves the selected collection +on refresh, and shows its three newest published videos, not playlist position. +Playlist membership is paginated before sorting (up to 1,000 entries); overlapping +entries are deduplicated. Empty collections are labeled honestly. + +Data loads on each visit and refreshes every 15 minutes while the tab is visible. +"Checked" describes the request time; PeerTube/proxy caching can delay newly +published items. Failure retains selected examples or previously checked cards +with a notice rather than claiming they are current. JavaScript-disabled visitors +can use the permanent channel and playlist links. Requests use 10-second timeouts +and a 2 MiB response limit. Titles are rendered as text, and watch/thumbnail URLs +are restricted to the PeerTube origin. No descriptions, HTML, or players are embedded. + +### Local preview and content checks + +With Node.js 24 or later, run `node scripts/preview.mjs` from this repository +to preview the assembled homepage at http://127.0.0.1:8082/. An optional numeric +port argument selects a different port. The preview serves only the public +webroot, expands the three allowlisted common SSI includes, and binds only to +loopback. It does not start the database or emulate registration, sign-in, +membership, or payments; those routes show a preview-only unavailable notice. + +Run `node --test tests/*.test.mjs` for offline checks of metadata, navigation, +featured work, preserved community/project links, preview request security, and +publication loading, sorting, pagination, and failure behavior. +File-symlink tests may be skipped on Windows without symlink privileges; +directory-junction containment is checked separately. + ## Membership flow 1. Anyone can request a free level-0 account. A one-hour, single-use email link allows diff --git a/htdocs/common/footer.html b/htdocs/common/footer.html index 47d9e3e..ce905e8 100644 --- a/htdocs/common/footer.html +++ b/htdocs/common/footer.html @@ -1,10 +1,14 @@