Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Ink Laravel Package

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.

View on GitHub
Deep Wiki
Context7

title: Installation description: Install Ink in your Laravel application. navigation: icon: i-lucide-download

Requirements

  • PHP: 8.4+
  • Laravel: 12+
  • Filament: 5.x
  • Database: PostgreSQL, MySQL, SQLite

Quick Setup

::steps

Install Package

composer require relaticle/ink

::alert{type="info"} For private repositories, add the VCS repository to your composer.json first:

"repositories": [
    {"type": "vcs", "url": "git@github.com:relaticle/ink.git"}
]

::

Run Migrations

php artisan migrate

This creates blog_posts, blog_categories, blog_tags, and blog_post_tag tables. Tag tables are empty unless you enable the tags feature.

Register Filament Plugin

use Relaticle\Ink\InkPlugin;

$panel->plugins([
    InkPlugin::make(),
]);

Publish Config (optional)

php artisan vendor:publish --tag=ink-config

::

Done! Visit your Filament panel — you'll see the Blog section with Posts and Categories.

Pick your install mode

The package ships two install modes:

Mode When to use Doc
Headless (default) You want the Blade components and admin, but full control over routing/views Frontend Setup (headless)
Public-routes mode (opt-in) You want a working blog at /blog without writing a single controller Public-routes mode

Most teams porting from the Tapix/FilaForms internal blog packages want public-routes mode — it ships the same flow they had, just behind a flag.

Default config

After publishing, config/ink.php looks like this. Everything is opt-in — defaults match the headless mode, so the package is a no-op until you flip a flag:

return [
    'prefix' => 'blog',
    'layout' => 'layouts.app',
    'author_model' => \App\Models\User::class,
    'per_page' => 12,

    'features' => [
        'public_routes' => false,  // /blog, /blog/{slug}, /blog/category/{slug}, signed /blog/preview/{post}
        'feed'          => false,  // /blog/feed (RSS 2.0)
        'sitemap'       => false,  // helper for spatie/laravel-sitemap
        'tags'          => false,  // /blog/tag/{slug}, TagResource admin
        'media_library' => false,  // SpatieMediaLibraryFileUpload (requires spatie/laravel-medialibrary)
    ],

    'feed' => [
        'title' => null,         // falls back to config('app.name')
        'description' => null,
        'author_email' => null,  // RSS <author> email
    ],

    'publisher' => [
        'name' => null,    // Organization name (JSON-LD)
        'url' => null,
        'logo' => null,    // Path to logo (used with asset())
    ],

    'tables' => [
        'posts' => 'blog_posts',
        'categories' => 'blog_categories',
    ],
];

See Configuration for the full reference.

Morph Map

If your app enforces morph maps, register the blog models:

Relation::enforceMorphMap([
    // ...existing entries
    'blog_post' => \Relaticle\Ink\Models\Post::class,
    'blog_category' => \Relaticle\Ink\Models\Category::class,
    'blog_tag' => \Relaticle\Ink\Models\Tag::class,
]);

SEO Migration

The package depends on ralphjsmit/laravel-seo. Publish its migration:

php artisan vendor:publish --tag=seo-migrations
php artisan migrate

Upgrading from the Tapix/FilaForms internal blog packages

The schema is identical (blog_posts and blog_categories table names match). To swap:

composer remove tapix/blog        # or filaforms/blog
composer require relaticle/ink

Then enable public-routes mode in config:

'features' => [
    'public_routes' => true,
    'feed' => true,
],

No data migration needed.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
besmartand-pro/php-quality-config
sentix/ai-chatbot
terminal42/code-quality-tools
codifyo/ts-generator-bundle
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity