relaticle/ink
Filament-native content publishing for Laravel: Eloquent models, full admin for posts/categories, SEO + JSON-LD, RSS, search, Blade UI components, and 13 MCP tools for AI agents. Headless by default with optional public blog routes.
Filament-native content publishing for blog, docs, and AI-citable articles. Ships Eloquent models, a full Filament admin, MCP tools for AI agents, SEO components, publishable Blade UI components, and an opt-in public-routes mode for hosts that want a working blog without writing controllers.
BlogPosting + BreadcrumbList on post pages, FAQPage and HowTo auto-detected from content (opt-in), Blog + CollectionPage on listingsPost::search() scope (LIKE by default, override for FTS / Scout), drop-in BlogSearch Livewire component with ?q= URL sync/blog, /blog/{slug}, /blog/category/{slug}, signed /blog/preview/{post}, and optional /blog/feedfeatures.tags) — many-to-many blog_post_tag table, TagResource admin UI, public archive at /blog/tag/{slug}features.media_library) — when both the flag is on AND spatie/laravel-medialibrary is installed, the featured-image upload uses SpatieMediaLibraryFileUpload instead of the plain FileUpload. Falls back gracefully if MediaLibrary isn't installed.composer require relaticle/ink
Register the plugin and run migrations:
// AppPanelProvider.php
->plugin(\Relaticle\Ink\InkPlugin::make())
php artisan migrate
By default this package is fully headless: no routes, no controllers, no forced views. Your app owns all rendering.
To get a working blog at /blog without writing any controllers, flip the feature flag:
// config/ink.php
'features' => [
'public_routes' => true, // /blog, /blog/{slug}, /blog/category/{slug}, /blog/preview/{post}
'feed' => true, // adds /blog/feed (RSS 2.0)
'tags' => true, // /blog/tag/{slug}, TagResource in admin
'media_library' => true, // SpatieMediaLibraryFileUpload (requires spatie/laravel-medialibrary)
],
'layout' => 'layouts.app', // your host layout to extend
Routes register at the service-provider level — no Filament panel boot is required, so the public site keeps working for guests who never touch the admin.
Publish the views if you want to customize them:
php artisan vendor:publish --tag=ink-views
{{-- In your blog show page --}}
<x-your-layout>
@push('head')
<x-ink::meta-tags :post="$post" />
<x-ink::feed-link />
@endpush
<x-ink::structured-data :post="$post" />
<x-ink::post-header :post="$post" />
<x-ink::post-body :post="$post" />
<x-ink::related-posts :post="$post" />
</x-your-layout>
MIT
How can I help you explore Laravel packages today?