Laravel plugin
diazoma/laravel serves a cursor feed, the /.well-known/wall.json manifest and an optional /xr embed page from a
Laravel 12 app. It needs PHP 8.4 or newer.
composer require diazoma/laravelphp artisan vendor:publish --tag=diazoma-configThe service provider is auto-discovered. Routes are registered only when diazoma.enabled is true.
Make a feed
Section titled “Make a feed”Implement Diazoma\Laravel\Contracts\WallFeed, or use the trait for an Eloquent model:
use Diazoma\Laravel\Concerns\ProducesWallFeed;use Diazoma\Laravel\Contracts\WallFeed;use Diazoma\Laravel\Support\WallItem;use Illuminate\Database\Eloquent\Builder;use Illuminate\Database\Eloquent\Model;
class ListingFeed implements WallFeed{ use ProducesWallFeed;
protected function wallQuery(): Builder { return Listing::query()->where('published', true); } protected function wallSort(): array { return ['created_at' => 'desc']; } protected function wallItem(Model $m): WallItem { return new WallItem(id: (string) $m->getKey(), link: "/listing/{$m->getKey()}", image: $m->thumb_url, aspect: 1.5, title: $m->title); } protected function wallSearchColumns(): array { return ['title']; } // optional, enables ?q= protected function wallFilters(): array { return ['type' => 'kind']; } // optional, ?type=video}Register it in config/diazoma.php:
'feeds' => ['latest' => ['class' => ListingFeed::class, 'title' => 'Latest', 'search' => true]],The feed is served at GET /wall/feed/latest?cursor=&q=&limit=. The prefix comes from route_prefix.
Paging is keyset-based over the sort columns plus the primary key, so UUID and integer keys both work and rows that share a sort value are not repeated or skipped. A malformed cursor returns the first page.
Manifest and embed
Section titled “Manifest and embed”/.well-known/wall.json is built from diazoma.manifest and the feeds list. It is not behind diazoma.middleware,
so other programs can discover the site. The feed and embed routes do run through diazoma.middleware, for example
your age gate.
Set diazoma.manifest.view to change how the wall looks for your site. It is copied into the manifest as it is, and an
empty view is left out. The shape and limits are in View customization.
To serve the Level 3 page at /xr, set diazoma.embed.enabled and DIAZOMA_BASE_URL, the directory that holds
diazoma-embed.js, wall.iife.js and loader.js. To advertise a wall that your host serves itself, leave
embed.enabled off and set embed.advertise to true. The manifest then carries embed.route and the package does not
register the route. Override the Blade view with the embed.view setting or in vendor/diazoma.
Device link
Section titled “Device link”Diazoma\Laravel\Contracts\DeviceLink is an interface only. There is no implementation and no route. Its docblock lists
the security rules an implementation must keep. See Actions and login.