Filament-native content publishing for blog, docs, and AI-citable articles. Headless by default, with opt-in public routes.

Maintainers

Package info

github.com/relaticle/ink

pkg:composer/relaticle/ink

Statistics

Installs: 54

Dependents: 0

Suggesters: 0

Stars: 1

Open Issues: 1

v2.1.0 2026-05-13 21:25 UTC

README

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.

Features

  • Filament Admin — PostResource and CategoryResource with markdown editor, draft/published/scheduled UX, SEO fields, featured images, and bulk publish/unpublish/schedule actions
  • SEO Components — Meta tags, Open Graph, Twitter Cards, RSS feed, per-page canonicals on paginated listings
  • JSON-LD SchemaBlogPosting + BreadcrumbList on post pages, FAQPage and HowTo auto-detected from content (opt-in), Blog + CollectionPage on listings
  • Search — Portable Post::search() scope (LIKE by default, override for FTS / Scout), drop-in BlogSearch Livewire component with ?q= URL sync
  • 13 MCP Tools — Full CRUD for posts and categories via Model Context Protocol, with markdown sanitization (HTML stripped, unsafe links blocked)
  • Publishable UI Components — Post card, header, body, related posts, category badge, preview banner — all with dark mode
  • Two install modes
    • Headless (default) — define your own routes/controllers, use the Blade components
    • Public-routes mode (opt-in) — flip a config flag, get /blog, /blog/{slug}, /blog/category/{slug}, signed /blog/preview/{post}, and optional /blog/feed
  • Tags taxonomy (opt-in via features.tags) — many-to-many blog_post_tag table, TagResource admin UI, public archive at /blog/tag/{slug}
  • MediaLibrary integration (opt-in via 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.
  • Sitemap Generator — Route-aware sitemap integration via spatie/laravel-sitemap
  • Reading-time + related-posts helpers on the Post model

Requirements

  • PHP 8.4+
  • Laravel 12+ or 13
  • Filament 5.x

Installation

composer require relaticle/ink

Register the plugin and run migrations:

// AppPanelProvider.php
->plugin(\Relaticle\Ink\InkPlugin::make())
php artisan migrate

Public-routes mode (opt-in)

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

Documentation

Read the full documentation →

Quick Example (headless)

{{-- 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>

License

MIT