PHPackages                             innocenzi/bluesky-notification-channel - 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. innocenzi/bluesky-notification-channel

ActiveLibrary

innocenzi/bluesky-notification-channel
======================================

Bluesky notification channel for the Laravel framework

v0.2.3(1y ago)3018.4k↑96.8%4[1 issues](https://github.com/innocenzi/bluesky-notification-channel/issues)[1 PRs](https://github.com/innocenzi/bluesky-notification-channel/pulls)MITPHPPHP ^8.1CI passing

Since Feb 9Pushed 1y ago1 watchersCompare

[ Source](https://github.com/innocenzi/bluesky-notification-channel)[ Packagist](https://packagist.org/packages/innocenzi/bluesky-notification-channel)[ Docs](https://github.com/innocenzi/bluesky-notification-channel)[ GitHub Sponsors]()[ RSS](/packages/innocenzi-bluesky-notification-channel/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (8)Dependencies (10)Versions (9)Used By (0)

Bluesky notification channel
----------------------------

[](#bluesky-notification-channel)

 [ ![Status](https://github.com/innocenzi/bluesky-notification-channel/actions/workflows/run-tests.yml/badge.svg) ](https://github.com/innocenzi/bluesky-notification-channel/actions?query=workflow%3Arun-tests)   [ ![npm](https://camo.githubusercontent.com/c1a532246f92b52aac9f3cb1722efed00d86d80f0c07b7cd6a623e81b945bd8e/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f696e6e6f63656e7a692f626c7565736b792d6e6f74696669636174696f6e2d6368616e6e656c) ](https://packagist.org/packages/innocenzi/bluesky-notification-channel)

 Notification channel implementation to create Bluesky posts using Laravel.

 ```
composer require innocenzi/bluesky-notification-channel
```

Configuring credentials
-----------------------

[](#configuring-credentials)

To interact with its API, Bluesky recommends creating an [application-specific password](https://atproto.com/specs/xrpc#app-passwords) instead of using your account's main password. You may generate one in your [account settings](https://bsky.app/settings/app-passwords). Once created, fill your `.env` accordingly:

```
BLUESKY_USERNAME=your-handle
BLUESKY_PASSWORD=your-app-password
```

Add these values to `config/services.php`:

```
return [
    // ...
    'bluesky' => [
      'username' => env('BLUESKY_USERNAME'),
      'password' => env('BLUESKY_PASSWORD'),
    ]
];
```

Publishing posts
----------------

[](#publishing-posts)

To create a post, you will need to instruct the [notification](https://laravel.com/docs/master/notifications#generating-notifications) of your choice to use the `BlueskyChannel` channel and to implement the corresponding `toBluesky` method.

This method may return a `BlueskyPost` instance or a simple `string`.

```
final class CreateBlueskyPost extends Notification
{
    public function via(object $notifiable): array
    {
        return [
            BlueskyChannel::class
        ];
    }

    public function toBluesky(object $notifiable): BlueskyPost
    {
        return BlueskyPost::make()
            ->text('Test from Laravel');
    }
}
```

You may then dispatch the notification:

```
// Without a notifiable
(new AnonymousNotifiable())->notify(new CreateBlueskyPost);

// With a notifiable
$post->notify(new CreateBlueskyPost);
```

Sessions
--------

[](#sessions)

Bluesky doesn't provide a way to authenticate requests using classic API tokens. Instead, they only offer a JWT-based authentication system, including an access and a refresh token.

Since these tokens expire, they cannot be stored in the environment. They are generated dynamically by creating and refreshing sessions and they need to be kept for as long as possible.

This notification channel implementation uses a session manager and an identity repository based on Laravel's cache. This may be overriden by swapping `NotificationChannels\Bluesky\IdentityRepository\IdentityRepository` in the container.

Additionnally, the key used by the cache-based identity repository may be configured by setting the `services.bluesky.identity_cache_key` option.

Embeds
------

[](#embeds)

For Bluesky, embeds are a client-side responsibility, which means we have to generate website embeds ourselves.

This notification channel implementation uses Bluesky's own private API, `cardyb.bsky.app`, to fetch a website's metadata, including an URL to its thumbnail. However, that thumbnail stills has to be uploaded to Bluesky as a blob, so a reference to that blob can be added to the post's embed.

You may disable automatic embed generation by calling `withoutAutomaticEmbeds` on a `BlueskyPost` instance, or replace the implementation altogether by swapping `NotificationChannels\Bluesky\Embeds\EmbedResolver` in the container.

###  Health Score

39

—

LowBetter than 86% of packages

Maintenance43

Moderate activity, may be stable

Popularity40

Moderate usage in the ecosystem

Community15

Small or concentrated contributor base

Maturity45

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 87.5% 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 ~54 days

Recently: every ~49 days

Total

8

Last Release

446d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/f529e12119dd50e6be7d0d3ec1f74f917b1e9e5d30d5c4eeb41d331753387b13?d=identicon)[innocenzi](/maintainers/innocenzi)

---

Top Contributors

[![innocenzi](https://avatars.githubusercontent.com/u/16060559?v=4)](https://github.com/innocenzi "innocenzi (28 commits)")[![ClaraLeigh](https://avatars.githubusercontent.com/u/2524209?v=4)](https://github.com/ClaraLeigh "ClaraLeigh (1 commits)")[![freekmurze](https://avatars.githubusercontent.com/u/483853?v=4)](https://github.com/freekmurze "freekmurze (1 commits)")[![maciek-szn](https://avatars.githubusercontent.com/u/8281509?v=4)](https://github.com/maciek-szn "maciek-szn (1 commits)")[![paulhennell](https://avatars.githubusercontent.com/u/4799852?v=4)](https://github.com/paulhennell "paulhennell (1 commits)")

---

Tags

at-protocolblueskylaravelnotification-channelphplaravelnotification-channelblueskyEnzo Innocenzi

###  Code Quality

TestsPest

Code StylePHP CS Fixer

### Embed Badge

![Health badge](/badges/innocenzi-bluesky-notification-channel/health.svg)

```
[![Health](https://phpackages.com/badges/innocenzi-bluesky-notification-channel/health.svg)](https://phpackages.com/packages/innocenzi-bluesky-notification-channel)
```

###  Alternatives

[vormkracht10/laravel-mails

Laravel Mails can collect everything you might want to track about the mails that has been sent by your Laravel app.

24149.7k](/packages/vormkracht10-laravel-mails)[spatie/laravel-prometheus

Export Laravel metrics to Prometheus

2651.3M6](/packages/spatie-laravel-prometheus)[hydrat/filament-table-layout-toggle

Filament plugin adding a toggle button to tables, allowing user to switch between Grid and Table layouts.

6292.3k1](/packages/hydrat-filament-table-layout-toggle)[scalar/laravel

Render your OpenAPI-based API reference

6183.9k2](/packages/scalar-laravel)[ralphjsmit/laravel-helpers

A package containing handy helpers for your Laravel-application.

13704.6k2](/packages/ralphjsmit-laravel-helpers)[musahmusah/laravel-multipayment-gateways

A Laravel Package that makes implementation of multiple payment Gateways endpoints and webhooks seamless

852.2k1](/packages/musahmusah-laravel-multipayment-gateways)

PHPackages © 2026

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