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.
author_id foreign key (supports ULID/UUID)Post::getUrl() with fallbackRelaticle\Ink\Support\BlogListingSeo helper for building per-page SEOData for listings. Headless consumers can call BlogListingSeo::forIndex/forCategory/forTag from their own controllers.FAQPage JSON-LD on post pages when content contains an ## FAQ H2 followed by ### Question? / answer-paragraph pairs. Controlled by schema.faq_auto config (default true).HowTo JSON-LD on post pages when content contains a ## Steps H2 followed by ### Step Name / paragraph pairs. Opt-in via schema.howto_auto config (default false).Relaticle\Ink\Support\SchemaExtractor helper for FAQ + HowTo HTML parsing.Blog and CollectionPage JSON-LD on listing routes (blog.index emits both; blog.category and blog.tag emit CollectionPage).ink::pagination.blog. Listing pages (index/category/tag) use it by default. Publish via php artisan vendor:publish --tag=ink-views to customize.wire:navigate on the <x-ink::post-card> post-link and pagination links for SPA-feel navigation in Livewire 4 hosts. No-op when Livewire is not present.Post::search($term) query scope. Defaults to a portable LIKE search across title/excerpt/content. Override via search.callback config for Postgres FTS, MySQL FULLTEXT, Scout, etc./blog route now honors ?q= for search. The existing BlogListingSeo::forIndex(searchQuery:) call ensures noindex,follow is set on search result URLs.BlogSearch Livewire component (<livewire:blog::search />) with URL-synced ?q= query, 400ms debounce, and empty state. Theme-agnostic — publish the view at resources/views/vendor/ink/livewire/blog-search.blade.php to restyle.BlogSitemapGenerator now includes /blog/tag/{slug} URLs when the tags feature is enabled and the tag has published posts./blog, /blog/category/{slug}, /blog/tag/{slug}) now emit per-page canonical URLs and page-aware titles. Previously every paginated page canonicalized to page 1, causing Google to treat pages 2+ as duplicate content.show and preview routes now call seo()->for($post) so post-attached SEO (BlogPosting + BreadcrumbList + FAQPage JSON-LD) actually renders in public-routes mode. Previously the schema only worked for consumers who overrode the controller.manukminasyan/filament-blog to relaticle/inkManukMinasyan\FilamentBlog\ to Relaticle\Ink\FilamentBlogServiceProvider → InkServiceProviderFilamentBlogPlugin → InkPluginconfig/filament-blog.php → config/ink.php. Use config('ink.X') instead of config('filament-blog.X').filament-blog-config → ink-config, filament-blog-views → ink-views, filament-blog-migrations → ink-migrations, filament-blog-translations → ink-translations<x-blog::post-card> → <x-ink::post-card> (all components affected)view('blog::X') → view('ink::X')blog_posts, blog_categories, blog_tags, blog_post_tag) — no data migration requiredblog.index, blog.show, blog.category, blog.preview, blog.feed, blog.tag) — public API contract preserved/blog, configurable via config('ink.prefix'))composer remove manukminasyan/filament-blog
composer require relaticle/ink:^2.0
See UPGRADING.md for the full sed recipe.
How can I help you explore Laravel packages today?