NovaCard RSS News. v3.2.0
NovaCard RSS News

Laravel Nova · dashboard card

Three lines in a dashboard. Any feed on the screen.

One card class and a source key. The feed arrives cached, cleaned, sorted and limited, in one of four layouts — with no controller, no route file and no published assets on your side.

4Feed formats
3Cards
4Layouts
89Tests

app/Nova/Dashboards/Main.php

use Gabrielesbaiz\NovaCardRssNews\Cards\RssNewsCard;

public function cards(): array
{
    return [
        RssNewsCard::make()->source('laravel_news'),
    ];
}

No controller, no route file, no published assets

01 · Try it

Click a card. Click a layout. That is the API.

Every combination below is a real call with its real result. Pick a card class, then a layout, and the code and the rendering change together.

arrow keys step through · RssNewsCard, hero layout

Open the playground →

The call

What renders

02 · The problem

Reading a feed is easy. Reading it on a dashboard is not.

Every one of these is a bug somebody shipped with eighty lines of their own, and every one of them is handled here.

Availability

The publisher goes down

A fetch without a timeout hangs the dashboard request behind it. Requests time out in 8 seconds, retry twice, and a failure serves the cached copy labelled honestly as stale.

Dialects

Four incompatible formats

RSS 2.0, Atom, RDF and JSON Feed, detected by content because publishers get content types wrong. Everything lands in one item shape with an ISO-8601 date.

Safety

Remote content in an admin panel

Markup is stripped and entities decoded server side. URLs are never accepted from the client — an ad-hoc feed is encrypted into the card's meta with your app key.

03 · How a read works

Five ways a read ends. Only one of them waits.

A card asks for a feed. Before any network call happens, the cache decides which of these five it is — so the slow path is the exception, not the rule.

01

Cache is fresh

Younger than cache.ttl, 300 seconds by default. Returned as is — nothing leaves your network.

Instant
02

Cache is stale, upstream is fine

The old copy goes back immediately and a refresh runs behind it — queued when queue.enabled, inline otherwise. Only the first request past the TTL queues a job.

Instant, refreshed behind
03

Refresh, nothing changed

ETag and Last-Modified go back as conditional headers. A 304 extends the TTL without downloading or re-parsing anything.

A few hundred bytes
04

Upstream failed, cache has a copy

The cached items are served with stale: true and the card says "Showing cached copy". A dead publisher never blanks a dashboard.

Instant, labelled
05

Upstream failed, cache is empty

The only case that waits on the network, and the only one that can fail: 502, and the card offers a retry button rather than an empty list.

Up to 8s, then retry
→

Keep it in state 01

Schedule nova-rss:warm every five minutes and every read is a cache hit. With queue.enabled, even a stale one never waits.

The recommended setup
What the card receives
# GET /nova-vendor/nova-card-rss-news/feed?source=laravel_news&limit=1
{
  "key": "laravel_news",
  "fetched_at": "2026-09-25T18:04:11+00:00",
  "stale": false,          // state 01 above
  "parser": "rss2",
  "items": [{
    "id": "b1946ac92492d2347c6235b4d2611184",
    "title": "Laravel 12 released",
    "published_at": "2026-09-25T10:00:00+00:00",
    "source_key": "laravel_news"
  }]
}
Which feeds are in which state
$ php artisan nova-rss:check

 Status   Source         Parser  Items  Time      URL / error
 ok       bbc_world      rss2    34     241 ms    https://feeds.bbci.co.uk/…
 ok       laravel_news   rss2    20     118 ms    https://feed.laravel-news.com/
 fail     old_blog       -       0      5003 ms   HTTP 404

Exits non-zero on any failure, so it belongs in CI — a moved feed is found before a user finds it.

Support this package

Free forever. Not free to maintain.

When this works, you never think about it. You do not see the publisher that started returning 403 to unknown user agents, the Atom feed that moved, the news site whose dates went non-standard, or the Nova release that changed how cards receive their meta. You see headlines on a dashboard. That invisibility is the work. It stays MIT either way.

Sponsorship buys the boring half: keeping the presets alive, the suite green across new PHP, Laravel and Nova majors, and answering issues from people running this in production. It does not buy features, and it does not unlock anything. It stays MIT either way.

FREE

Star the repo

Thirty seconds, and it is the first signal other developers look at.

FREE

Open a good issue

A feed URL and what you expected is worth more than you think — dead feeds are found by users first.

Sponsor from $5

Monthly, cancel anytime. It pays for the maintenance nobody sees.

Company tier

If this runs on your team's dashboards, your logo goes in the README and here.

Why ask at all? This package is MIT and always will be. Nothing is paywalled, nothing phones home, and no feed, preset or layout is held back for sponsors. Sponsorship buys maintenance time, not features — and if you cannot sponsor, the star and the bug report genuinely help.