PHPackages                             gabrielesbaiz/nova-card-rss-news - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. gabrielesbaiz/nova-card-rss-news

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

gabrielesbaiz/nova-card-rss-news
================================

A Laravel Nova card to show news from RSS feeds.

v2.4.0(1mo ago)012.7k↑8265%[1 PRs](https://github.com/gabrielesbaiz/nova-card-rss-news/pulls)MITPHPPHP ^8.0CI failing

Since Mar 5Pushed 1mo ago1 watchersCompare

[ Source](https://github.com/gabrielesbaiz/nova-card-rss-news)[ Packagist](https://packagist.org/packages/gabrielesbaiz/nova-card-rss-news)[ Docs](https://github.com/gabrielesbaiz/nova-card-rss-news)[ GitHub Sponsors]()[ RSS](/packages/gabrielesbaiz-nova-card-rss-news/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (5)Dependencies (19)Versions (16)Used By (0)

Nova Card RSS News
==================

[](#nova-card-rss-news)

[![Latest Version on Packagist](https://camo.githubusercontent.com/faba20e32bb026f3655affbbb9886523cce75a2c68fe4748626e73c139cf0171/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6761627269656c65736261697a2f6e6f76612d636172642d7273732d6e6577732e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/gabrielesbaiz/nova-card-rss-news)[![Total Downloads](https://camo.githubusercontent.com/61c9ac45ecccc6b970f5d920719d62f898d72dd2ffac0fe64b2003a3b5e0bb61/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6761627269656c65736261697a2f6e6f76612d636172642d7273732d6e6577732e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/gabrielesbaiz/nova-card-rss-news)[![License](https://camo.githubusercontent.com/8b0c557b5b5d093c081c7f63ef7945d93fc5f5fa4005022387828b51e908c240/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f6761627269656c65736261697a2f6e6f76612d636172642d7273732d6e6577732e7376673f7374796c653d666c61742d737175617265)](LICENSE.md)

A polished Laravel Nova dashboard card that streams RSS feeds with a hero item, branded gradient background, source favicon, relative timestamps and skeleton loader. Ships with a category-grouped catalogue of curated Italian news and insurance sources, fully configurable from your app.

Two card variants:

- **`NovaCardRssNews`** — one card, one source. Pinned to the source you choose in PHP.
- **`NovaCardRssNewsSelect`** — same look, with an in-header dropdown to switch source at runtime. Selection persists per browser in `localStorage`.

Features
--------

[](#features)

- Brand-aware UI driven by Nova's `--colors-primary-500` CSS variable — gradient background, pulsing live dot, glowing hover state. Automatically picks up your Nova primary colour.
- Source favicon resolved automatically via Google's S2 service (no manual logo upload).
- Hero card + compact list layout with hover-translate chevron, 2-line title clamp and shine-on-hover effect.
- Relative timestamps in Italian (`5 min fa`, `2 h fa`, `3 g fa`) with the full date in a tooltip; updates every 30 seconds.
- Skeleton shimmer while loading, friendly empty state, manual refresh button, custom thin scrollbar.
- HTML entities (`&#039;`, `&amp;`, …) and stray `` / `` tags are stripped server-side before render.
- 5-minute response cache on the news endpoint to avoid hammering upstream feeds.
- Sources organised by category — comment out anything you don't want exposed.

Requirements
------------

[](#requirements)

- PHP 8.0+
- Laravel 10, 11 or 12
- Laravel Nova 5

Installation
------------

[](#installation)

```
composer require gabrielesbaiz/nova-card-rss-news
```

Publish the config file (optional — the bundled catalogue works out of the box):

```
php artisan vendor:publish --tag=nova-card-rss-news-config
```

The card's JS and CSS are auto-served by the package's `CardServiceProvider`. Nothing to publish or build on the host app.

Usage
-----

[](#usage)

Add the card to any dashboard or resource:

```
use Gabrielesbaiz\NovaCardRssNews\NovaCardRssNews;
use Gabrielesbaiz\NovaCardRssNews\NovaCardRssNewsSelect;

public function cards(): array
{
    return [
        // Fixed-source card
        (new NovaCardRssNews)
            ->source('ansa_motori')
            ->limit(5)
            ->width('1/3'),

        // User-switchable source card
        (new NovaCardRssNewsSelect)
            ->defaultSource('motor1')
            ->limit(10)
            ->width('1/3'),
    ];
}
```

### `NovaCardRssNews`

[](#novacardrssnews)

MethodDescriptionDefault`->source(string $key)`RSS source key from the config catalogue.`motor1``->limit(int $limit)`Maximum number of news items to render.`10``->width(string $w)`Standard Nova card width (`1/3`, `1/2`, `full`).`1/2`### `NovaCardRssNewsSelect`

[](#novacardrssnewsselect)

MethodDescriptionDefault`->defaultSource(string $key)`Initial source shown when the user has no persisted choice.`motor1``->limit(int $limit)`Maximum number of news items to render.`10``->width(string $w)`Standard Nova card width.`1/2`The dropdown is populated from the `GET /nova-vendor/nova-card-rss-news/sources` endpoint and groups options by category via ``. Each browser remembers the last picked source per card.

Configuration
-------------

[](#configuration)

The published config lives at `config/nova-card-rss-news.php`. Sources are grouped by category. To disable a feed, comment its line out — the rest of the catalogue keeps working.

```
return [

    'categories' => [

        'assicurazioni_specializzate' => [
            'label' => 'Assicurazioni — Testate specializzate',
            'sources' => [
                'assinews' => [
                    'title' => 'Assinews',
                    'url' => 'https://www.assinews.it/feed/',
                ],
                // 'insurance_trade' => [ ... ],  // ← disabled
                'insurance_up' => [
                    'title' => 'InsuranceUp',
                    'url' => 'https://www.insuranceup.it/feed/',
                ],
            ],
        ],

        'motori' => [
            'label' => 'Motori',
            'sources' => [
                'motor1' => [
                    'title' => 'Motor1.com',
                    'url' => 'https://it.motor1.com/rss/articles/all/',
                ],
            ],
        ],

    ],

];
```

### Adding a new source

[](#adding-a-new-source)

1. Pick the category that fits (or add a new key under `'categories'` with `label` + `sources`).
2. Add a new entry to `sources` keyed by a stable slug — that slug becomes the value you pass to `->source('...')` / `->defaultSource('...')`.
3. Reference it from a card.

```
'sources' => [
    'my_custom_feed' => [
        'title' => 'My Custom Feed',
        'url' => 'https://example.com/feed.xml',
    ],
],
```

### Bundled catalogue

[](#bundled-catalogue)

CategorySources**Assicurazioni — Testate specializzate**Assinews, Intermedia Channel, InsuranceUp**Assicurazioni — Autorità e istituzioni**IVASS, ANIA**Assicurazioni — Sezioni da testate economiche**Il Sole 24 ORE — Finanza, FIRSTonline**Motori**Motor1, Alvolante, ANSA Motori, Corriere Motori, Il Sole 24 ORE Motori, Motori.it**Economia / Finanza**Il Sole 24 ORE (Italia, Finanza, Norme &amp; Tributi, Risparmio)**Quotidiani nazionali**Repubblica (home/politica/economia/cronaca), Corriere homepage, La Stampa, Il Fatto Quotidiano, Panorama**Agenzie di stampa**ANSA (tutte/top news/cronaca/sport/economia/cultura)**Sport**Gazzetta dello Sport**Aggregatori**Google News ItaliaHow it works
------------

[](#how-it-works)

```
┌────────────────────────────┐    GET /sources       ┌────────────────────────┐
│  CardSelect.vue (browser)  │ ────────────────────► │   SourcesController    │
└────────────────────────────┘                       └──────────┬─────────────┘
                                                                │
                                                                ▼
                                              config('nova-card-rss-news.categories')

┌────────────────────────────┐    GET /news?key      ┌────────────────────────┐    fetch RSS
│      Card.vue (browser)    │ ────────────────────► │     NewsController     │ ─────────────►  Upstream feed
└────────────────────────────┘                       └──────────┬─────────────┘                 (cached 5 min)
                                                                │
                                                                ▼
                                                       RssFeedService::getRssFeed()
                                                       — entity-decode title/desc
                                                       — strip ,
                                                       — return title, url, items[]

```

Testing
-------

[](#testing)

```
composer test
```

The package ships a Pest 3 suite covering: config shape, source lookup, HTML entity decoding, the `/sources` controller payload, the `NewsController` 404 path, both card classes' meta payloads, and an arch test that bans `dd`/`dump`/`ray` from the source.

Changelog
---------

[](#changelog)

See [CHANGELOG.md](CHANGELOG.md) for release notes.

Credits
-------

[](#credits)

- [Gabriele Sbaiz](https://github.com/gabrielesbaiz)
- [All Contributors](../../contributors)

License
-------

[](#license)

The MIT License (MIT). See [LICENSE.md](LICENSE.md).

###  Health Score

47

—

FairBetter than 93% of packages

Maintenance90

Actively maintained with recent releases

Popularity27

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity51

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~40 days

Recently: every ~0 days

Total

13

Last Release

50d ago

Major Versions

1.0.2 → 2.0.0.x-dev2026-06-29

### Community

Maintainers

![](https://www.gravatar.com/avatar/97040fb60637d4b81897347524bc9343ffa6b978d4b19c0c28ea0823e2a1752b?d=identicon)[gabrielesbaiz](/maintainers/gabrielesbaiz)

---

Top Contributors

[![gabrielesbaiz](https://avatars.githubusercontent.com/u/22818698?v=4)](https://github.com/gabrielesbaiz "gabrielesbaiz (16 commits)")

---

Tags

laravelGabriele Sbaiznova-card-rss-news

###  Code Quality

TestsPest

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/gabrielesbaiz-nova-card-rss-news/health.svg)

```
[![Health](https://phpackages.com/badges/gabrielesbaiz-nova-card-rss-news/health.svg)](https://phpackages.com/packages/gabrielesbaiz-nova-card-rss-news)
```

###  Alternatives

[defstudio/telegraph

A laravel facade to interact with Telegram Bots

818355.4k3](/packages/defstudio-telegraph)[nativephp/mobile

NativePHP for Mobile

1.1k102.1k151](/packages/nativephp-mobile)[spatie/laravel-health

Monitor the health of a Laravel application

88212.7M189](/packages/spatie-laravel-health)[harris21/laravel-fuse

Circuit breaker for Laravel queue jobs. Protect your workers from cascading failures.

46273.9k](/packages/harris21-laravel-fuse)[psalm/plugin-laravel

Psalm plugin for Laravel

3345.4M354](/packages/psalm-plugin-laravel)[simplestats-io/laravel-client

Server-side analytics for Laravel that follows the full funnel from visit to registration to payment, attributed to the channel that drove it. Revenue, MRR, churn and ad-spend profit (ROAS/CAC) per channel. GDPR compliant, ad-blocker proof.

5226.7k](/packages/simplestats-io-laravel-client)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
