npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@rmdes/indiekit-endpoint-microsub

v1.0.49

Published

Microsub endpoint for Indiekit. Enables subscribing to feeds and reading content using the Microsub protocol.

Readme

@rmdes/indiekit-endpoint-microsub

A comprehensive Microsub social reader plugin for Indiekit. Subscribe to feeds (RSS, Atom, JSON Feed, h-feed), organize them into channels, and read posts in a unified timeline interface with a built-in web reader UI.

Features

  • Microsub Protocol: Full implementation of the Microsub spec
  • Multi-Format Feeds: RSS, Atom, JSON Feed, h-feed (microformats)
  • Smart Polling: Adaptive tiered polling (2 minutes to 17+ hours) based on update frequency
  • Real-Time Updates: WebSub (PubSubHubbub) support for instant notifications
  • Web Reader UI: Built-in reader interface with channel navigation and timeline view
  • Feed Discovery: Automatic discovery of feeds from website URLs
  • Read State: Per-user read tracking with automatic cleanup
  • Compose Interface: Post replies, likes, reposts, and bookmarks via Micropub
  • Webmention Support: Receive webmentions in your notifications channel
  • Media Proxy: Privacy-friendly image proxying
  • OPML Export: Export your subscriptions as OPML

Installation

npm install @rmdes/indiekit-endpoint-microsub

Configuration

Add to your Indiekit config:

import MicrosubEndpoint from "@rmdes/indiekit-endpoint-microsub";

export default {
  plugins: [
    new MicrosubEndpoint({
      mountPath: "/microsub", // Default mount path
    }),
  ],
};

Usage

Web Reader UI

Navigate to /microsub/reader in your Indiekit installation to access the web interface.

Channels: Organize feeds into channels (Technology, News, Friends, etc.)

  • Create new channels
  • Configure content filters (exclude types, regex patterns)
  • Reorder channels

Feeds: Manage subscriptions within each channel

  • Subscribe to feeds by URL
  • Search and discover feeds from websites
  • Edit or rediscover feed URLs
  • Force refresh feeds
  • View feed health status

Timeline: Read posts from subscribed feeds

  • Paginated timeline view
  • Mark individual items or all items as read
  • View read items separately
  • Click through to original posts

Compose: Create posts via Micropub

  • Reply to posts
  • Like posts
  • Repost posts
  • Bookmark posts
  • Include syndication targets

Microsub API

Compatible with Microsub clients like Indigenous and Monocle.

Endpoint: Your Indiekit URL + /microsub

Supported Actions:

  • channels - List, create, update, delete, reorder channels
  • timeline - Get timeline items (paginated)
  • follow - Subscribe to a feed
  • unfollow - Unsubscribe from a feed
  • mute - Mute URLs
  • unmute - Unmute URLs
  • block - Block authors
  • unblock - Unblock authors
  • search - Discover feeds from URL
  • preview - Preview feed before subscribing

Example:

# List channels
curl "https://your-site.example/microsub?action=channels" \
  -H "Authorization: Bearer YOUR_TOKEN"

# Get timeline for channel
curl "https://your-site.example/microsub?action=timeline&channel=CHANNEL_UID" \
  -H "Authorization: Bearer YOUR_TOKEN"

# Subscribe to feed
curl "https://your-site.example/microsub" \
  -X POST \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d "action=follow&channel=CHANNEL_UID&url=https://example.com/feed"

Feed Polling

Feeds are polled using an adaptive tiered system:

  • Tier 0: 1 minute (very active feeds)
  • Tier 1: 2 minutes (active feeds)
  • Tier 2: 4 minutes
  • Tier 3: 8 minutes
  • ...
  • Tier 10: ~17 hours (inactive feeds)

Tiers adjust automatically:

  • Feed updates → decrease tier (faster polling)
  • No changes for 2+ fetches → increase tier (slower polling)

WebSub-enabled feeds receive instant updates when available.

Read State Management

Read items are tracked per user. To prevent database bloat, only the last 30 read items per channel are kept. Unread items are never deleted.

Cleanup runs automatically:

  • On server startup
  • After marking items read

Integration with Other Plugins

Blogroll Plugin

If @rmdes/indiekit-endpoint-blogroll is installed, Microsub will automatically sync feed subscriptions:

  • Subscribe to feed → adds to blogroll
  • Unsubscribe → soft-deletes from blogroll

Micropub Plugin

The compose interface posts via Micropub. Ensure @indiekit/endpoint-micropub is configured.

OPML Export

Export your subscriptions:

GET /microsub/reader/opml

Returns OPML XML with all subscribed feeds organized by channel.

Webmentions

The plugin accepts webmentions at /microsub/webmention. Received webmentions appear in the special "Notifications" channel.

To advertise your webmention endpoint, add to your site's <head>:

<link rel="webmention" href="https://your-site.example/microsub/webmention" />

Media Proxy

External images are proxied through /microsub/media/:hash for privacy and caching. This prevents your IP address from being sent to third-party image hosts.

API Response Format

All API responses follow the Microsub spec. Timeline items use the jf2 format.

Example timeline response:

{
  "items": [
    {
      "type": "entry",
      "uid": "https://example.com/post/123",
      "url": "https://example.com/post/123",
      "published": "2026-02-13T12:00:00.000Z",
      "name": "Post Title",
      "content": {
        "text": "Plain text content",
        "html": "<p>HTML content</p>"
      },
      "author": {
        "name": "Author Name",
        "url": "https://author.example/",
        "photo": "https://author.example/photo.jpg"
      },
      "_id": "507f1f77bcf86cd799439011",
      "_is_read": false
    }
  ],
  "paging": {
    "after": "cursor-string"
  }
}

Database Collections

The plugin creates these MongoDB collections:

  • microsub_channels - User channels
  • microsub_feeds - Feed subscriptions with polling metadata
  • microsub_items - Timeline items (posts)
  • microsub_notifications - Notifications channel items
  • microsub_muted - Muted URLs
  • microsub_blocked - Blocked authors

Troubleshooting

Feeds not updating

  • Check the feed's nextFetchAt time in the admin UI
  • Use "Force Refresh" button to poll immediately
  • Try "Rediscover" to find the correct feed URL

"Unable to detect feed type" error

  • The URL may not be a valid feed
  • Try using the search feature to discover feeds from the homepage
  • Check if the feed requires authentication

Items disappearing after marking read

This is normal behavior - only the last 30 read items per channel are kept to prevent database bloat. Unread items are never deleted.

Duplicate items

Deduplication is based on the feed's GUID/URL. If a feed doesn't provide stable GUIDs, duplicates may appear.

Contributing

Issues and pull requests welcome at github.com/rmdes/indiekit-endpoint-microsub

License

MIT

Credits

Built by Ricardo Mendes for the IndieWeb community.