
Short answer: Lektor is a Python static content management system, and it does not create a feed on its own. Add the atom plugin, write a small configuration file that names your blog folder and the feed address, give every post a title, a date and a body, and rebuild the site. Lektor then writes a valid Atom file next to your pages. Check that the links are absolute, publish the output, and give the address of the feed to an auto-poster so that every new post is shared on your social networks.
Lektor sits between a static site generator and a full CMS. Your content lives in plain text files, the build is done by Python, and there is a friendly admin interface that editors can open in a browser while the site is edited locally. That combination suits small teams that want a fast site without a database. It also means that a feed is a build artefact: it is created when you build, it changes only when you build again, and it is only as good as the data in your content files. This guide covers the plugin setup, the content model, the deployment and the checks that keep the feed reliable.
Lektor plugins are Python packages that you add to the project with its own command. Run it from the root of the project, next to the project file.
lektor plugins add lektor-atomThe command records the plugin in the project file, and the next build downloads and loads it. The plugin generates an Atom feed, which is a close relative of RSS: it carries the same information in a stricter format, with required identifiers and dates. Auto-posters and feed readers understand Atom, so there is no need to produce a second format unless a particular tool demands it. If you maintain another Python site generator as well, compare this approach with the Pelican feed guide および the Hexo feed guide.
Plugin settings live in the configs folder of the project, in a file named after the plugin. One section describes one feed, so a site with a blog and a news area can have two.
# configs/atom.ini
[blog]
name = Example Journal
source_path = /blog
url_path = /feed.xml
items = 20The name is shown by feed readers, the source path says which part of the content tree supplies the items, the URL path is the address of the file and the item count limits its size. The plugin also has options that tell it which fields of your content model hold the title, the body, the date and the author, and the names of those options depend on the version, so read the documentation of the version that you installed. Twenty items are plenty for an auto-poster, and a short file is fetched faster.
A feed item needs a title, a permanent address, a date and a summary. In Lektor these come from the model of your posts and from the content file of each post.
# models/blog-post.ini
[model]
name = Blog Post
label = {{ this.title }}
[fields.title]
type = string
[fields.pub_date]
type = date
[fields.summary]
type = text
[fields.body]
type = markdown# content/blog/spring-opening-hours/contents.lr
title: Spring opening hours
---
pub_date: 2026-10-30
---
summary: Our new opening hours start on Monday.
---
body:
The full text of the post starts here.The model above is only an example, and your site may use other field names. What matters is that the date is a real date field and not free text, because the feed must sort the posts and write the date in a standard format. Without a time, two posts published on the same day have no clear order, so if you publish more than once a day, store the time as well.
| Feed element | Source in Lektor | Rule |
|---|---|---|
| Title | title field of the post | Plain text, no markup |
| Link and identifier | URL of the post page | Absolute, https, never changes |
| Date | pub_date field | A date field, not the build time |
| Summary or body | summary or body field | Complete sentences, no cut words |
| Feed address | url_path in atom.ini | Stable, listed in the page head |
The address of a post deserves the most attention. Lektor builds it from the folder name of the post, so renaming a folder changes the address, and an auto-poster that stores identifiers will treat the old and the new address as two different posts. Choose folder names carefully before publishing and keep them. The causes and cures of repeated posts are covered in why a feed auto-posts the same article twice.
Absolute links need to know the real address of the site. In Lektor the address is part of the project settings, in the project file, where the primary alternative can carry a URL. If you leave it out, the plugin has to guess, and the feed may contain relative links or the address of your local test server. Set the address to the public domain with the https scheme, rebuild and look at the first link in the file. This single setting causes more broken feeds than any other, because it works silently on your own computer and fails only for readers.
Build the site into a folder and look at the file itself instead of assuming that it is right.
lektor build --output-path public
head -40 public/feed.xml
grep -c "<entry>" public/feed.xmlThen paste the live address into the W3C Feed Validation Service and fix every error. A longer routine is in the feed validation guide, and a shorter one in debugging a feed with curl.
Auto-posters build the best social posts from a feed that gives them a short summary and a picture. Write a real summary for every post instead of cutting the body automatically, because an automatic cut can end in the middle of a sentence and that is exactly what the auto-poster will copy. Lektor handles images as attachments of a page, so keep one good picture for each post, name the file clearly and make sure the page template uses it as the social image. Whether to put the full text or only a summary in the feed is discussed in full text or excerpt in an RSS feed.
Text is stored as UTF-8 in the content files, and the feed declares UTF-8 too, so the two agree. Problems appear when text is pasted from a word processor with control characters that XML does not allow, or when a file is saved in another encoding. Save every content file as UTF-8 and look at the feed after adding a post that contains accents, quotation marks or an emoji. See why special characters and emoji break feeds.
Because the feed is built, not served, time works differently from a database site. A post with a date in the future is included at the next build unless you exclude it, and an auto-poster will share it at once. Decide on one rule. You can add a field that marks a post as a draft and skip those posts in your templates, or you can build only on the day when the post should appear. Whichever you pick, test it with one draft post before the first real release. For the effect of old dates see the guide to feed order and backdated posts.
People and tools should not have to guess where the feed is. Add a link element to the head of your base template, with the relation set to alternate, the type set to the Atom media type and the absolute address of the feed. A person or a tool that only knows your home page can then find the feed on its own. The full explanation is in the guide to feed autodiscovery.
Lektor can publish the output with its own deploy command or you can copy the folder to any static host. After the first deployment, request the live file and compare it with the local one.
curl -I https://example.com/feed.xml
curl -s https://example.com/feed.xml | head -20The first command should return a 200 status and a content type that names XML. A web server may deliver an unknown extension as plain text, and some readers then refuse the file, so check the header and fix it in the server configuration if needed. Also look at how long a cache in front of the site keeps the file, because a feed that lags behind your site delays every social post. The meaning of the status codes is described in the guide to feed status codes.
PostRSS has been publishing RSS and Atom feeds to social networks since 2014. Paste the address of your feed, connect your accounts and choose how each post is built from the title, the description or the page title. PostRSS checks the feed as often as every minute and shares each new entry, with its image and link, to the channels you choose among 66 supported networks, messengers, team chats and blogs, including LinkedIn, X, Bluesky, Mastodon and Telegram. Keyword filters, UTM parameters and posting windows let you tune each channel. See the PostRSS features page and the plan limits on the pricing page. More developer guides are under the Technical Guide tag.
A Lektor feed is a short list of decisions: the atom plugin, a config file with the blog folder and the feed address, a post model with real dates and summaries, a public site address in the project and stable folder names. Build, read the file, validate it, deploy it and test the live address. After that, connect it to an auto-poster, and every post you publish reaches your readers and your social channels without anyone copying links by hand.
No. Lektor has no built-in feed, but the atom plugin generates an Atom feed from a folder of posts once you add a small configuration file.
Yes. Atom is a standard feed format, and auto-posters and readers understand it as well as RSS. Use the address of the file on your live domain.
The public address of the site is probably missing from the project settings. Set it to your real domain with https, rebuild and check the first link in the file.
Yes. The feed is a static file created at build time, so it changes only when you build and publish the site again.
Yes. PostRSS reads any valid RSS or Atom address that is reachable without a login. Paste the address, connect your channels and new posts are shared as soon as they appear.
What changed in the networks, what broke, and how to fix it before it costs you reach.
PostRSSを手がけるInternet Solutionsが開発。どの製品も、それぞれの形で時間を節約します。