Airwave for Craft CMS

Configuration

Feed options

Every feed has its own settings, and most of them override a site-wide default rather than replacing it.

Feed URLThe document to fetch. Paste a site address instead and press Find the feed.
HandleWhat you type in templates and reference tags.
Refresh intervalHow often this feed is refetched. Hourly by default. Per-feed intervals are Pro; Lite uses the site-wide interval.
Items to keepThe prune ceiling. Older items past this count are removed — except imported ones.
Maximum ageDrop items older than N days. Undated items are always kept, never dropped.
Request headersFor private feeds. Values are run through App::parseEnv().
Link rewritingAppend UTM parameters or an affiliate tag to outgoing links (Pro).

Private feeds

There is deliberately no password field. Add a request header on the feed instead:

Authorization: $FEED_TOKEN

The $FEED_TOKEN is resolved from your environment at fetch time, so the token stays in .env rather than in the database — and in every backup of it.

Refreshing

A feed that has never been fetched is read inline the first time something asks for it, so a template does not render an empty box on the first page load. A feed that is merely stale queues a job, so a slow publisher can never become a slow page.

To drive refreshes from cron instead, turn off Refresh on the front end in the settings and run:

php craft airwave/feeds/refresh --due

--due fetches only the feeds whose own interval has elapsed, so the schedule stays per feed rather than becoming whatever the crontab says. A sensible crontab entry is every fifteen minutes; feeds set to refresh daily still refresh daily.

A failed refresh never empties a feed

If a fetch fails — the host is down, the document is malformed, the certificate expired — the items already stored stay exactly where they are and keep rendering. Only the health indicator on the feed changes. A publisher's bad afternoon should not blank a section of your homepage.

Filters (Pro)

Filters are rules about what is allowed in, and they run on the way in. An item that was never wanted is never stored, and therefore can never be imported into an entry by accident.

FilterMatches on
Keywords — includeTitle and summary. An item must match at least one.
Keywords — excludeTitle and summary. Any match rejects the item.
CategoriesThe item's own categories or tags.
AuthorsThe item's author.
Maximum agepublishedAt, when there is one.

Because filters run on the way in, changing the rules only affects future items. To apply new rules to what you already have, use Reapply filters on the feed — it is a separate, explicit button because it deletes stored items.

Channels

A channel is a URI on your site plus enough configuration to answer it.

SourceYour own content (an element query) or the items Airwave has collected.
FormatRSS 2.0 on Lite; RSS, Atom or JSON Feed on Pro.
URIWhere it is served, e.g. blog.rss. Airwave routes this itself.
SiteWhich site's content the channel broadcasts — not the same thing as which site it is served from.
Item limitHow many items the document carries.
Cache durationHow long the built document is cached, and what Cache-Control says.

For your own content, Airwave works out the mapping: the entry title, its URL, a summary or excerpt field, the author, and the first image field it finds. On Pro you can replace any of those with an object template:

{{ object.body }}
{{ object.author.fullName }}
{{ object.featureImage.one().url ?? '' }}

Import mapping (Pro)

On a feed's Import tab, choose a section and entry type, decide whether new entries arrive enabled or disabled, and map the parts of an item onto your fields — with a token:

summary · content · url · author · image · categories · guid · domain · publishedAt

— or with a Twig template, for anything a token does not cover:

{{ item.summary }} <p><a href="{{ item.url }}">Read the original on {{ item.domain }}</a></p>

Categories map onto a Tags field by creating tags, and onto a Categories field by matching existing ones. An aggregator inventing branches in your category tree is not a favour.

Settings

Most settings are defaults that a single feed can override. Two are deliberately site-wide, because they are safety rails rather than preferences.

Allow private network fetches

Off, and it should stay off. A feed URL is user input on any site where a non-admin can add one, and http://169.254.169.254/… is the standard way that ends badly. Airwave resolves every host and refuses private and reserved addresses — and re-checks every hop of a redirect chain, because an open redirect on a public host walks straight past a check that only looks at the URL somebody typed.

Turn this on only when you are subscribing to a feed on your own network.

Clean incoming HTML

On. Every item goes through HTML Purifier before it can reach a page. Airwave's configuration allows images, links, headings, lists and video embeds, and blocks forms, style blocks, scripts and id attributes that would collide with your own page.

Point it at your own config/htmlpurifier/*.json if you want something else.

Other settings

Refresh on the front endWhether a stale feed may queue its own refresh job. Off if you drive refreshes from cron.
Default refresh intervalThe starting interval for a new feed.
Default items to keepThe starting prune ceiling for a new feed.
Request timeout and Maximum response sizeFetch ceilings. A feed that will not answer, or answers with 90MB, is abandoned rather than absorbed.

Permissions

View feeds and itemsRead the CP screens
Add and edit feedsSubscribe and configure
Delete feeds and items
Refresh feedsFetch on demand
Import items as entriesSeparate on purpose — importing writes into a live section, which is a larger thing than subscribing to a URL
Publish and edit channels