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
- You publish a JSON Feed with a
_webringextension on your site - Other sites add your feed URL to their webring widget
- The widget fetches and displays entries from all connected feeds
- 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 includesentriesanderrors.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.