Focus on content

This commit is contained in:
2026-10-31 15:11:21 -04:00
parent 88ce1d1e03
commit 1c8daf01df
17 changed files with 3003 additions and 119 deletions
+87
View File
@@ -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