tilabs/laravel-content

A markdown based headless cms inspired by nuxt/content and Sushi Eloquent Driver.

Installs: 1

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 0

Forks: 0

Open Issues: 0

pkg:composer/tilabs/laravel-content

v1.0.0 2025-05-27 02:25 UTC

This package is auto-updated.

Last update: 2025-11-27 03:54:08 UTC


README

⚡️ Generate markdown based Blog Posts with ease. Inspired by @nuxt/content and Caleb Porzio.

License: MIT

Why this package

I personally use this package in a lot of cms based websites. This is only a very rough version, but I will improve it over time.

Requirements

Version
PHP ^8.2
Laravel ^12.0
Sushi by Caleb Porzio ^2.5
League Commonmark ^2.6

Installation & Usage

composer require tilabs/laravel-content

Publish the configuration

php artisan vendor:publish --provider="Tilabs\LaravelContent\Providers\ContentServiceProvider"

Write content

Place your Markdown files inside /content

Create Markdown files anywhere under the configured content directory.

touch content/Hello World.md

Front-matter drives titles, tags, and publication status.

---
title: "Hello World"
tags: [introduction, laravel, cms]
published: true
---

# Hello World

This is my first post.
Headings get automatic IDs and permalinks.

Files without a published key will automatically be drafted

Slug rules

  • Directories are flattened and joined by the configured separator ("_" by default).
  • Numbers or dates at the start of a segment are stripped (2025-05-27-, 01-, etc.).
  • Files named index.md are ignored in the slug
  • Example file tree → slug mapping:
content/
├── News/
│ └── 2025-05-27-Laravel-Content.md → news_laravel-content
└── 01-getting-started/index.md → getting-started

Query content in code

If you cannot see your changes right away, jump to the next chapter

You can now query the markdown content like an Eloquent Model thanks to Sushi. Content already has published and drafted scopes to filter for Content.

use Tilabs\LaravelContent\Models\Content;

// all published posts
$posts = Content::published()->get();

// a single post by slug
$post = Content::where('slug', 'news_laravel-content')->firstOrFail();

Refreshing Content

Whenever you rename, add, or delete Markdown files in production, clear the Sushi-based cache:

php artisan content:clear

During local development you can disable caching ('cache' => false) and the model will refresh on every request.

License

Laravel Deploy is open‑sourced software licensed under the MIT license.