What Is a Webring?

Webrings were one of the earliest forms of community building on the internet. In the 1990s, before search engines dominated discovery, webrings linked together sites with shared interests. You’d visit a site, click “next” or “previous,” and travel through a curated ring of related pages.

The original webrings died off as Google became the default way to find things online. But something was lost in the process: the serendipity of stumbling on a small, personal site that someone poured their energy into. The web became centralized, discoverable only through algorithms that favor engagement over substance.

We think it’s time to bring webrings back — updated for the modern web.

The Subversive Software Webring

Our webring is built on open standards. Instead of a central directory that controls membership, it uses JSON Feed — an open format that any site can generate. If you can publish a JSON file, you can join the ring.

The webring widget fetches feeds from multiple sources, merges them, deduplicates entries, and displays them in a responsive card grid. It’s a web component that runs entirely in the browser — no server required, no tracking, no analytics.

How It Works

  1. You publish a JSON Feed with a _webring extension on your site
  2. Other sites add your feed URL to their webring widget
  3. The widget fetches and displays entries from all connected feeds
  4. Visitors discover your content through the ring

It’s peer-to-peer discovery. No algorithms. No corporate intermediaries. Just people sharing what they’ve made.

How to Join

Step 1: Create a JSON Feed

Your site needs a JSON Feed that includes the _webring extension. Here’s a minimal example:

{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Your Site Name",
  "home_page_url": "https://yoursite.example.com/",
  "description": "A short description of your site",
  "_webring": {
    "version": "1.0",
    "tags": ["indie-web", "privacy"]
  },
  "authors": [
    {
      "name": "Your Name",
      "url": "https://yoursite.example.com/"
    }
  ],
  "items": [
    {
      "id": "https://yoursite.example.com/posts/my-post",
      "url": "https://yoursite.example.com/posts/my-post",
      "title": "My Post Title",
      "summary": "A brief summary of the post",
      "date_published": "2026-03-15T00:00:00Z",
      "tags": ["indie-web"]
    }
  ]
}

The key requirement is the _webring object with a version field. Without it, the widget won’t recognize your feed.

Most static site generators (Hugo, Jekyll, Eleventy, etc.) can generate JSON Feed with a custom template. If you use Hugo, this site already generates a webring-compatible feed at /blog/feed.json — you can use our template as a starting point.

The webring widget is open source. You can find the source code, documentation, and examples in the webring repository on GitHub.

Step 2: Add Your Feed to the Ring

Once your feed is published, reach out to us or any webring member to get your feed URL added. The more sites that include each other’s feeds, the stronger the ring becomes.

Step 3: Embed the Widget on Your Site

Want to show the webring on your own site? Add the widget with a single script tag and HTML element:

<script src="https://subversivesoftware.org/js/webring-widget.iife.js"></script>

<webring-widget
  sources="https://subversivesoftware.org/blog/feed.json,https://yoursite.example.com/feed.json"
  max-items="10"
  sort-by="date"
></webring-widget>

That’s it. The widget handles fetching, merging, deduplication, and rendering automatically.

Widget Configuration

The webring widget is a standard web component with attributes you can customize:

Attribute Default Description
sources Comma-separated feed URLs (required)
max-items 25 Maximum entries to display
sort-by date Sort by date, title, or random
sort-order desc asc or desc
tags Filter entries by tags (comma-separated)
show-images true Show entry thumbnails
show-tags true Show entry tags
show-authors true Show author info
loading lazy lazy (load when visible) or eager
cache-ttl 300 Cache duration in seconds
columns auto Grid columns (0 = auto-fill)

Styling

The widget uses Shadow DOM but exposes CSS custom properties for theming:

webring-widget {
  --webring-card-bg: #1a1a2e;
  --webring-card-border: 1px solid #333;
  --webring-title-color: #e0e0e0;
  --webring-summary-color: #aaa;
  --webring-tag-bg: #2a2a4a;
  --webring-tag-color: #ccc;
  --webring-gap: 1.5rem;
}

Events

The widget dispatches custom events you can listen for:

  • webring:load — Fired when feeds finish loading. Detail includes entries and errors.
  • webring:error — Fired for each feed that fails to load.
  • webring:entry-click — Fired when a card is clicked.

Why a Webring?

Webrings embody what we believe about the web:

  • Decentralized — No single point of control or failure
  • Opt-in — You choose who to connect with
  • Transparent — The feeds are just JSON files anyone can read
  • Private — No tracking, no analytics, no user profiling
  • Resilient — If one site goes down, the rest of the ring continues

The modern web doesn’t have to be a collection of walled gardens. We can build bridges between independent sites and help people discover content that no algorithm would surface.

What’s Next

We’re starting small. Our own blog is the first feed in the ring. As more sites join, the webring grows more valuable — and more subversive. If you run a site focused on privacy, digital rights, open source, or the indie web, we’d love to have you.

Check out the live webring to see it in action, browse the source code on GitHub, and get in touch if you want to join.