Search by

socialdept / atp-appview-filament

socialdept

Run and inspect AT Protocol AppViews from a Filament panel in Laravel

Package info

github.com/socialdept/atp-appview-filament

pkg:composer/socialdept/atp-appview-filament

Statistics

Installs: 8

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

dev-main 2026-10-19 23:08 UTC

README

Run and inspect AT Protocol AppViews from a Filament panel in Laravel.


Warning

In early development. Nothing here is ready to use yet. Expect breaking changes until the first tagged release.

What is ATP AppView Filament?

An operator panel for an AppView built on atp-appview, added to any Filament panel as a plugin. It covers the AT Protocol side of running an AppView: whether the network is flowing into the index, what the index holds, what it does to stay correct, and what is being backfilled.

Requirements

  • PHP 8.3+
  • Laravel 11.28+, 12 or 13
  • Filament 5
  • atp-appview

Installation

composer require socialdept/atp-appview-filament
php artisan filament:assets

Add the plugin to a panel:

use SocialDept\AtpAppviewFilament\AtpAppviewPlugin;

public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->plugin(AtpAppviewPlugin::make());
}

Who can reach the panel is up to the panel, through canAccessPanel() on the user model as usual.

What it adds

  • Network, Index and Upkeep stats on the dashboard, from atp-appview's AppviewStatus: whether Tap is up and how far behind the index is, what the index holds, and how reconciliation, followed lexicons and the blocklist are doing. Each stat's second line adds a figure rather than restating the label.
  • A Collections table: records, repos, hidden records and tombstones per collection, as appview:stats last counted them, with a button to count again. Each record count opens that collection on the Records page.
  • Backfill cards on the dashboard: one per running backfill, and per one that ended in the last hour, with how many repos have delivered, records received, the rate, the time left, and why one failed.
  • A backfill notice at the top of every other page while a backfill runs, since lists and counts may be missing records until it finishes.
  • Identities: every repo the index knows, with its avatar, handle, PDS, account status, record count and what the reconciler last found, errors grouped by kind. Reconcile one repo or a selection now.
  • Identity pages: each repo laid out as a social profile, with its banner, avatar, display name, handle, pronouns, bio and website from Profiles, its PDS, record and collection counts, and when it last wrote. Below, its records across collections, newest first, narrowed to one by clicking a collection. From its page: reconcile with a preview of what would change before anything is written, block or unblock, and retry or reindex its failed deliveries. Under More: refresh its handle, PDS and profile, resync it in Tap, see Tap's status for it, and links to its repo, Bluesky profile, PDS, PLC audit log and records. Everything destructive asks first.
  • Records: the index a collection at a time, companion collections such as profiles included, filtered by repo, tombstones or hidden records, with each record in a JSON viewer.
  • Lexicons: followed lexicons, the revision in use and any new version held back, with its breaking changes listed and a button to accept it anyway. Check for new versions from the page.
  • Blocklist: block a repo by DID or every repo on a PDS host, optionally deleting what is already indexed, purge and unblock.
  • Labelers: the labelers Tack follows, with each one's profile, connection, labels kept and labels received, and follow and unfollow. A labeler's page lists the values it declares with their names, severity, what they blur and the labeler's default, what each does here on content and on accounts, and how many are in force, with a Change action to set a policy or return to the default.
  • Moderation log: every ban, review and takedown, by an operator or a label, with who, why, when, and when it was lifted.
  • Moderate menu on identity pages: block, ban, needs review, keep or prune a banned account's records, and take down or restore it on a PDS you run. Badges on the profile show what is in force, the account's labels colored by what they do, and whether you host it. Records tables show each record's labels the same way.
  • Failed Deliveries: events ingest parked because no handler could take them, with the error and the event in the JSON viewer. Retry once the cause in the app is fixed, reindex from the record's PDS once the record is, or forget them, one at a time or a selection. The navigation shows how many are parked. Below them, what ingest hooks rejected and ingest repairs rewrote, by class and collection.

The JSON viewer highlights the value and links what can be followed: AT-URIs and DIDs, web URLs, blobs on the repo's PDS, and a $type naming a followed lexicon.

Options

AtpAppviewPlugin::make()
    ->navigationGroup('AppView')   // or null for none
    ->dashboardWidgets(false)      // place the widgets yourself
    ->backfillNotice(false)        // no notice on every page
    ->identities(false)            // leave out a page: also records(),
                                   // lexicons(), blocklist(),
                                   // failedDeliveries(), labelers()
                                   // and moderation()
    ->recordLinks(fn (string $uri) => "https://pdsls.dev/{$uri}")

AT-URIs and DIDs link to pds.ls unless recordLinks() says otherwise. The pages sit under /appview/ in the panel's URL space.

The plugin's styles are built on Filament's color variables, so they follow the panel's colors and dark mode without a custom theme.

License

MIT