All notable changes to this project will be documented in this file.
- Host-owned views: an
ink.viewsconfig map lets a host point any of the six public-routes actions (index,show,category,tag,preview,feed) at a view it already owns, instead of rendering ink's ownink::pages.*views. Every key defaults tonulland is purely additive — see Host-Owned Views. ink.middlewareconfig key for the blog route group, defaulting to['web']. Add your own middleware (e.g. a response transformer for AI crawlers) alongside it.preview()now passesrelatedPostsandeditUrlto the view. RegisterInk::resolvePreviewEditUrlUsing()in a service provider'sboot()to supply the edit link; ink's own preview page now renders it via<x-ink::preview-banner>, matching the contract host-owned preview views already had.Post::tableOfContents(string $tag = 'h2')builds afragment => heading textmap from the rendered post, for hosts building an in-page table of contents. Restricted toh1-h6; any other value throwsInvalidArgumentException.show()andpreview()now eager-loadtagson the post, so$post->tagsno longer triggers a lazy-load query in either view.
/blog/preview/{post}now constrains{post}to[0-9]{1,18}(the safe maximum for a signed 64-bit id) instead of the unboundedwhereNumber(), closing a public unauthenticated 500 that an over-long digit segment could trigger via abigintoverflow on Postgres.blog.feedis now registered only whenfeatures.feedistrue, instead of always being registered behind a runtimeabort_unless()check.
See UPGRADING.md for the full migration notes, including the route:cache implication of the blog.feed change.
- First-class MCP support: a shippable
BlogServer, tool authorization through the host'sGateinstead of a hardcodedis_admincheck, and anInk::resolveAuthorUsing()hook for hosts whose staff aren'tink.author_modelinstances.
- MCP tools now store markdown instead of pre-rendering to HTML, matching what the Filament editor already stored. The included migration converts existing HTML rows.
- Long unbreakable tokens (URLs, code identifiers) in a post title no longer overflow the post page layout.
- JSON-LD structured data now escapes
</script>,&,'and", closing an injection hole where a post title or excerpt containing</script>broke out of the schema block and rendered as visible page text. - The default
showandpreviewviews now strip raw HTML from post content before rendering markdown, closing a stored-XSS hole where a<script>in a post body executed on the public page.
- Widened the
spatie/laravel-sluggableconstraint to allow^4.
Relaticle\Ink\Support\BlogListingSeohelper for building per-pageSEODatafor listings. Headless consumers can callBlogListingSeo::forIndex/forCategory/forTagfrom their own controllers.- Auto-emit
FAQPageJSON-LD on post pages when content contains an## FAQH2 followed by### Question?/ answer-paragraph pairs. Controlled byschema.faq_autoconfig (defaulttrue). - Auto-emit
HowToJSON-LD on post pages when content contains a## StepsH2 followed by### Step Name/ paragraph pairs. Opt-in viaschema.howto_autoconfig (defaultfalse). Relaticle\Ink\Support\SchemaExtractorhelper for FAQ + HowTo HTML parsing.- Auto-emit
BlogandCollectionPageJSON-LD on listing routes (blog.indexemits both;blog.categoryandblog.tagemitCollectionPage). - Numbered, aria-labeled pagination view at
ink::pagination.blog. Listing pages (index/category/tag) use it by default. Publish viaphp artisan vendor:publish --tag=ink-viewsto customize. wire:navigateon 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 viasearch.callbackconfig for Postgres FTS, MySQL FULLTEXT, Scout, etc.- The shipped
/blogroute now honors?q=for search. The existingBlogListingSeo::forIndex(searchQuery:)call ensuresnoindex,followis set on search result URLs. BlogSearchLivewire component (<livewire:blog::search />) with URL-synced?q=query, 400ms debounce, and empty state. Theme-agnostic — publish the view atresources/views/vendor/ink/livewire/blog-search.blade.phpto restyle.
BlogSitemapGeneratornow includes/blog/tag/{slug}URLs when the tags feature is enabled and the tag has published posts.- Listing routes (
/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. - Shipped
showandpreviewroutes now callseo()->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.
- Package renamed from
manukminasyan/filament-blogtorelaticle/ink - PHP namespace changed from
ManukMinasyan\FilamentBlog\toRelaticle\Ink\ - Service provider renamed:
FilamentBlogServiceProvider→InkServiceProvider - Filament plugin renamed:
FilamentBlogPlugin→InkPlugin - Config file renamed:
config/filament-blog.php→config/ink.php. Useconfig('ink.X')instead ofconfig('filament-blog.X'). - Publish tags renamed:
filament-blog-config→ink-config,filament-blog-views→ink-views,filament-blog-migrations→ink-migrations,filament-blog-translations→ink-translations - View component prefix renamed:
<x-blog::post-card>→<x-ink::post-card>(all components affected) - View namespace renamed:
view('blog::X')→view('ink::X')
- Database table names (
blog_posts,blog_categories,blog_tags,blog_post_tag) — no data migration required - Route names (
blog.index,blog.show,blog.category,blog.preview,blog.feed,blog.tag) — public API contract preserved - URL prefix default (still
/blog, configurable viaconfig('ink.prefix')) - All public model/component APIs and method signatures
composer remove manukminasyan/filament-blog
composer require relaticle/ink:^2.0See UPGRADING.md for the full sed recipe.
- Detect user ID column type for
author_idforeign key (supports ULID/UUID)
- Initial release
- Post and Category Eloquent models with SEO, slugs, soft deletes
- PostStatus enum (Draft/Published)
- Filament PostResource with markdown editor, status toggle, SEO section
- Filament CategoryResource with post count
- 13 MCP tools for blog post and category CRUD
- 10 publishable Blade components (meta-tags, structured-data, feed-link, feed, post-card, post-header, post-body, related-posts, category-badge, preview-banner)
- BlogSitemapGenerator with route-aware URL generation
- Dark mode support in all UI components
- Route-aware
Post::getUrl()with fallback