qTe Docs — Syndication

Syndication

Publishing, feed system, dynamic filters, deduplication, and import workflows

Syndication Overview

Syndication allows users to share encoded content publicly through the qte.app hub account. Published items appear in the syndication feed, where other qTe users can browse, filter, import, and decode shared content.

SYNDICATION FLOW Author Encodes content Publish qte.app Hub app.qte.syndication Public feed records Pull Feed Reader Browse, filter, import Reader Actions Import → local offsets Decode → original data

Publishing Workflow

Publishing writes a syndication record to the hub account's AT Proto repository. The record contains metadata about the encoded content — not the content itself.

Publish Steps

  1. User encodes content (creates Symph + offsets + metadata)
  2. User selects "Publish" or "Publish & Syndicate" from the Publish page
  3. App creates a syndication record with: Symph, title, author, tags, category, timestamp, size
  4. Record is written to app.qte.syndication collection on the hub account's PDS
  5. Optional: attach a meme image to the syndication record
Author identity: The author field uses the user's AT Protocol handle (e.g., @username.bsky.social), providing decentralized identity verification.

Feed Loading & Processing

When loading the syndication feed, the app pulls records from the hub's app.qte.syndication collection and processes them through several stages:

Pull Records from hub PDS StripSystemTags "published","syndicated" Dedup by Symph Keep newest per symph Build Filters Dynamic from data Display FilteredItems SyndicationDisplayItem Properties Title | AuthorDisplay | Category | Tags | TimeAgo | FormattedSize | StatusIcon | Text | Filename | Symph

Dynamic Filters

Filters are built dynamically from the feed data — not from a static list. The UpdateDynamicFilters() method extracts unique categories, authors, and tags from all feed items and populates dropdown/picker lists.

Filter Types

FilterSourceBehavior
SearchQueryText inputMatches against title, author, tags, text (case-insensitive)
SelectedCategoryDropdown/PickerFilters by category icon/name — built from feed data
SelectedAuthorDropdown/PickerFilters by author handle — built from feed data
SelectedTagDropdown/PickerFilters by tag — built from feed data

StripSystemTags

System tags ("published", "syndicated") are automatically stripped from the comma-separated tag string before display. These are internal workflow markers, not user-visible tags.

Deduplication

Feed items are deduplicated by Symph identifier. When multiple records share the same Symph (e.g., re-published or re-syndicated), only the newest record is kept. This uses a HashSet<string> tracking seen Symphs, processing items from newest to oldest.

// Dedup logic (simplified)
var seenSymphs = new HashSet<string>();
var sorted = items.OrderByDescending(i => i.Timestamp);
foreach (var item in sorted)
{
    if (!seenSymphs.Add(item.Symph)) continue; // skip duplicate
    filteredList.Add(item);
}

Import & Decode

From the syndication feed, users can:

  • Import: Download the offset file and metadata from the author's PDS to local storage. The content is now available for local decoding.
  • Decode: If offsets are already local, decode the Symph directly to restore original data.

Hub Account (qte.app)

The hub account qte.app serves as the central syndication broadcast point. Its PDS repository holds all app.qte.syndication records. When users pull the syndication feed, they read from this account's repository.

Hub Details

Handleqte.app
RoleSyndication broadcast aggregator
Collectionapp.qte.syndication
AccessRead-only for consumers, write during publish