Iklil

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.

inbox / sourcesone model
Incoming feeds
RSS 2.0parsed
Atom 1.0parsed
JSON Feedparsed
RSS 1.0parsed
Iklil::Entry
idpost-42
titleA clearer way to read
urlhttps://example.com/post-42
published2026-09-21
content:html

diagnostics: 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 }