Phase 3 frontend harmonization: apply the same avatar fallback pattern
used in ActivityPub to all Microsub templates. A fallback initials span
is always rendered; when the <img> loads, it covers the fallback via
absolute positioning. Broken images are removed by event delegation,
revealing the initials underneath.
Templates updated: item-card, item, actor, author (3 avatar sizes:
40px card, 48px detail, 80px profile). Error delegation script added
to reader layout.
Confab-Link: http://localhost:8080/sessions/bb4a6ec4-b711-48cd-b3d7-942ec2a9851d
- Namespace all plugin CSS classes with ms- prefix (20 BEM blocks)
- Update all 19 templates to match prefixed class names
- Replace visually-hidden with -!-visually-hidden (core convention)
- Remove inline onerror handlers from avatar/photo images
- Remove dead source-type SVG icons (Fediverse/Bluesky/Web)
Confab-Link: http://localhost:8080/sessions/bb4a6ec4-b711-48cd-b3d7-942ec2a9851d
Add ability to mark all items from a specific feed/source as read at once,
instead of clicking each item individually. The mark-read button becomes a
split button group with a caret that opens a popover offering "Mark [source]
as read". Items without a feedId (AP items) keep the simple button.
Confab-Link: http://localhost:8080/sessions/a477883d-4aef-4013-983c-ce3d3157cfba
Items from channels with userId: null (created during earlier setup)
appeared in the unified timeline but had no _channelUid, causing the
mark-read JS handler to silently abort. Fall back to channelId (MongoDB
ObjectId) when channelUid is unavailable, and resolve it server-side
via getChannelById.
Confab-Link: http://localhost:8080/sessions/4d40ef89-a713-48c1-b4ed-0ffafca25677
Adds a save icon to the item-card action bar that POSTs to
/readlater/save when the readlater plugin is installed. Button
only renders if application.readlaterEndpoint is set. Includes
JS handlers in both channel and timeline views.
Items in the cross-channel timeline now carry per-item channel UID so
the mark-read API call can target the correct channel. Adds the same
dismiss animation used in the channel view.
Nunjucks slice(0, 4) creates 0 chunks (not Array.slice behavior),
producing an empty array. Photos and categories were never rendered
in item-card and actor views. Also add image proxying to reader
controller matching the Microsub API.
- Add lib/feeds/capabilities.js: detect feed source capabilities
(webmention, micropub, platform type) on subscribe and first fetch
- Enrich timeline items with source_type from capabilities or URL inference
- Add protocol indicator icons (Bluesky/Mastodon/web) to item-card.njk
- Auto-select syndication target in compose based on interaction URL protocol
- Modified: follow.js, processor.js, reader.js, item-card.njk
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add actor profile page with outbox fetcher for viewing AP actor posts
- Add follow/unfollow buttons on actor profile (delegates to AP plugin)
- Add AP actor link on item cards for posts from ActivityPub sources
- Add ensureActivityPubChannel() for auto-creating Fediverse channel
- Add AP-aware item storage with dedup, attachments, and categories
- Add CSS styles for actor profile cards and AP-specific UI elements
- Bump version to 1.0.31
- Add bookmark button to item-card.njk (timeline view)
- Add mark-read button to item.njk (full item view)
- Add JavaScript handler for mark-read on item page
- Pass channel info to item template for mark-read API call
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>