Many feeds. One shape.
RSS, Atom, and JSON Feed arrive differently. Iklil gives a Ruby reader one immutable model, with diagnostics when the source is imperfect.
Incoming feeds
RSS 2.0parsed
Atom 1.0parsed
JSON Feedparsed
RSS 1.0parsed
Iklil::Entry
id
post-42title
A clearer way to readurl
https://example.com/post-42published
2026-09-21content
:htmldiagnostics: invalid date on entry 7
Parse the feed, not its quirks.
One call accepts the common syndication formats. OPML travels through a separate subscriptions API.
RSS
0.90, 0.91, 0.92, 1.0 (RDF), and 2.0.
Atom
Atom 1.0 with normalized links, authors, and dates.
JSON Feed
Versions 1.0 and 1.1 map to the same Feed and Entry values.
OPML
Import subscription lists and export them deterministically.
Recover without hiding the damage.
Malformed fields produce diagnostics. Iklil does not fetch URLs or sanitize HTML; keep those decisions in the application.
Relative links resolve against the supplied source URL. DTDs and external entities are removed before XML parsing.
require "iklil"
feed = Iklil.parse(bytes, base_url: "https://example.com/feed.xml")
feed.entries.each { |entry| puts entry.title }
feed.diagnostics.each { |issue| warn issue.message }