James Griffin 13f7f12499
All checks were successful
CI / test (pull_request) Successful in 1m5s
CI / test (push) Successful in 52s
Fix thread post spacing: add reply padding and increase margins
Replies had no left padding from the border (padding-left:0) and too-tight
vertical spacing (margin:4px). Bump to padding-left:12px and margin:8px.

Closes #2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 09:59:09 -03:00
2026-03-25 20:50:17 -03:00
2026-03-25 20:50:17 -03:00
2026-03-25 20:50:17 -03:00
2026-03-25 20:50:17 -03:00

Bluesky Threads — FreshRSS Extension

A FreshRSS extension that enriches Bluesky posts in your RSS feeds by fetching the full reply thread and embedded content via the Bluesky public API, collapsing everything into a single article.

Features

  • Fetches full reply threads when a post is first saved, so API sync clients (Fever, GReader, etc.) receive enriched content immediately
  • Automatically refreshes thread content as it ages, with progressively relaxed refresh intervals
  • Renders rich text with working links, mentions, and hashtags
  • Renders all embed types: images, external link cards, quoted posts, and videos
  • No Bluesky account or API credentials required

Installation

  1. Download or clone this repository into FreshRSS's extensions/ directory. The folder must be named xExtension-BlueskyThreads.
  2. In FreshRSS, go to Extensions and enable Bluesky Threads.

Configuration

In the extension settings, you can set Thread depth (default: 10, max: 1000) — how many levels of replies to fetch per post.

How it works

Hooks

Two hooks work in tandem so both the web UI and API sync clients receive enriched content:

  • EntryBeforeInsert — fires once when a new entry is first saved. Fetches the thread immediately and stores the rendered HTML.
  • EntryBeforeDisplay — fires on every web render. Checks if the cached thread is stale; if so, re-fetches and writes the updated HTML back to the database.

Cache & staleness

Thread HTML is cached as JSON files in DATA_PATH/BlueskyThreads/{md5(url)}.json. Staleness is determined by the post's age:

Post age Cache refresh interval
< 1 hour Every 10 minutes
< 24 hours Every 1 hour
< 7 days Every 12 hours
7+ days Never (frozen)

On API failure, the stale cache is served as a fallback.

API endpoints used

All requests go to public.api.bsky.app — no authentication required.

  • Handle resolution: com.atproto.identity.resolveHandle
  • Thread fetch: app.bsky.feed.getPostThread
Description
A FreshRSS extension that enriches Bluesky posts in your RSS feeds by fetching the full reply thread and emb edded content via the Bluesky public API, collapsing everything into a single article.
Readme 118 KiB
Languages
PHP 98.3%
HTML 1.7%