skip to main content

Build a Link Blog with Antenna

By R. S. Doiel, 2026-06-27

A link blog is a website where you share links to things you find interesting on the web — and optionally respond to them with commentary of your own. This tutorial shows how to build one with Antenna: subscribing to feeds, harvesting their content, and writing responses that appear alongside the harvested items.

For a simpler starting point, see Build a Blog with Antenna, which covers posting your own content without feed subscriptions.

Setting up

Create a directory for the site and change into it.

mkdir mylinkblog
cd mylinkblog

Initializing

antenna init
antenna css

init creates antenna.yaml and page.yaml. css writes css/site.css and links it in page.yaml.

Defining your reading list

A link blog is built around a collection — a Markdown file whose body lists the RSS/Atom feeds you want to follow. The collection’s name determines the output filenames: links.md produces links.html (the aggregated reading page) and links.xml (your own RSS feed).

Create links.md:

---
title: My Link Blog
description: Links and commentary from around the web.
---

# My Link Blog

Reading list below. Posts appear in reverse chronological order.

- [Dave Winer's Scripting News](http://scripting.com/rss.xml)
- [R. S. Doiel's blog](https://rsdoiel.github.io/rss.xml)

The list in the body is the subscription list. You can add or remove feeds by editing this file at any time.

Register the collection with Antenna:

antenna add links.md

This creates links.db (the SQLite3 database for the collection) and adds it to antenna.yaml.

Harvesting content

Pull content from all subscribed feeds into links.db:

antenna harvest

Antenna fetches each feed in the list and stores the items locally. On a slow connection or with many feeds, the first harvest may take a moment. Subsequent harvests are incremental.

Now render the HTML page and RSS feed:

antenna generate
antenna preview

Open http://localhost:8000/links.html to see the aggregated content. Each item shows the title, publication date, excerpt, and a link back to the original source.

Reviewing what was harvested

Check what is in the collection at any time:

antenna items links.md

This prints a Markdown list of every item in links.db — harvested feed entries and any posts you have added — in descending date order.

Writing a response

The most distinctive feature of a link blog is the ability to respond to something you read. Antenna’s quote action converts a text-fragment URL into a Markdown blockquote with source attribution, which you can use as the start of a response post.

Getting a text-fragment URL

In a modern browser, select the passage you want to quote, right-click it, and choose Copy link to highlight (Chrome/Edge) or equivalent. This copies a URL ending in #:~:text=the+selected+text.

Generating the blockquote

antenna quote "https://scripting.com/2026/06/27/example.html#:~:text=the+selected+passage" > response.md

antenna quote writes the blockquote and attribution to standard output. Redirecting to response.md gives you a file to edit.

The generated content looks like:

> the selected passage

([scripting.com](https://scripting.com/2026/06/27/example.html#:~:text=the+selected+passage), accessed 2026-06-27)

Adding your commentary

Open response.md in your editor and add a YAML front matter block and your own text:

---
title: Thoughts on Dave's point about RSS
description: My take on Dave Winer's argument for RSS as social infrastructure.
author: Your Name
keywords:
  - RSS
  - social web
link: https://scripting.com/2026/06/27/example.html
pubDate: "2026-06-27"
postPath: "blog/2026/06/27/thoughts-on-dave.html"
---

# Thoughts on Dave's point about RSS

> the selected passage

([scripting.com](https://scripting.com/2026/06/27/example.html#:~:text=the+selected+passage), accessed 2026-06-27)

My commentary goes here. I agree with Dave that...

The link field in the front matter points to the original article. The postPath determines where Antenna writes the rendered HTML.

Create the output directory and post the response to the links.md collection:

mkdir -p blog/2026/06/27
antenna post links.md response.md

Antenna renders blog/2026/06/27/thoughts-on-dave.html and records the post in links.db. Regenerate and preview:

antenna generate
antenna preview

Your response now appears in links.html alongside the harvested items, with the link field providing a connection back to the original article.

Listing your responses

To see only posts you have written (items with a postPath), use:

antenna posts links.md

To see everything in the collection — harvested items and your own posts:

antenna items links.md

The daily update cycle

A link blog stays current by re-harvesting regularly. The typical cycle is:

antenna harvest
antenna generate
antenna preview

Run this whenever you want to pull in new content. You can automate it with a cron job or a task scheduler:

# Example cron entry — harvest and generate every hour
0 * * * * cd /path/to/mylinkblog && antenna harvest && antenna generate

Customizing the page

Open page.yaml to personalise the HTML shell. A fuller example for a link blog:

lang: en-US

link:
  - rel: stylesheet
    type: text/css
    href: /css/site.css
  - rel: alternate
    type: application/rss+xml
    title: My Link Blog RSS
    href: /links.xml

header: |
  <h1>My Link Blog</h1>

nav: |
  <ul>
    <li><a href="/links.html">Links</a></li>
    <li><a href="/about.html">About</a></li>
  </ul>

footer: |
  <p>© 2026 Your Name — <a href="/links.xml">RSS</a></p>

The link element pointing to /links.xml adds an autodiscovery tag so feed readers can find your RSS feed automatically.

Adding an About page

antenna page about.md

See Build a Blog with Antenna for front matter metadata fields and the allowed_meta_fields allowlist.

Publishing

When the site looks right locally:

git add -A
git commit -m "Initial link blog"
git push origin main

After publishing, share your feed URL (https://yourdomain.example/links.xml) so others can subscribe to your link blog.