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. [Mail &amp; Notifications](/categories/mail)
4. /
5. innocenzi/bluesky-notification-channel

ActiveLibrary[Mail &amp; Notifications](/categories/mail)

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

Bluesky notification channel for the Laravel framework

v0.2.4(2mo ago)3126.7k↓38.8%5[2 issues](https://github.com/innocenzi/bluesky-notification-channel/issues)[1 PRs](https://github.com/innocenzi/bluesky-notification-channel/pulls)MITPHPPHP ^8.1CI failing

Since Feb 9Pushed 2mo 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 2d ago

READMEChangelog (9)Dependencies (20)Versions (10)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

49

—

FairBetter than 94% of packages

Maintenance83

Actively maintained with recent releases

Popularity39

Limited adoption so far

Community16

Small or concentrated contributor base

Maturity47

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 84.8% 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 ~99 days

Recently: every ~132 days

Total

9

Last Release

83d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/16060559?v=4)[Enzo Innocenzi](/maintainers/innocenzi)[@innocenzi](https://github.com/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)")[![kayschima](https://avatars.githubusercontent.com/u/43473477?v=4)](https://github.com/kayschima "kayschima (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

[spatie/laravel-permission

Permission handling for Laravel 12 and up

12.9k102.4M1.4k](/packages/spatie-laravel-permission)[spatie/laravel-pdf

Create PDFs in Laravel apps

1.0k4.8M47](/packages/spatie-laravel-pdf)[dedoc/scramble

Automatic generation of API documentation for Laravel applications.

2.1k11.2M100](/packages/dedoc-scramble)[vormkracht10/laravel-mails

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

24857.5k](/packages/vormkracht10-laravel-mails)[defstudio/telegraph

A laravel facade to interact with Telegram Bots

816333.6k3](/packages/defstudio-telegraph)[spatie/laravel-passkeys

Use passkeys in your Laravel app

471890.7k39](/packages/spatie-laravel-passkeys)

PHPackages © 2026

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