Skip to content

Content

Filebase pages and content fragments in Streams.

Introduction

Streams stores content as entries in configured sources. This hub page covers common content patterns; field types and adapters are documented in Core.

Pages stream

A typical pages stream uses the filebase source (default) with HTML or Markdown files:

{
    "id": "pages",
    "config": {
        "source": {
            "type": "filebase",
            "format": "html"
        }
    },
    "routes": [
        {
            "handle": "view",
            "uri": "{uri}",
            "parse": true,
            "view": "{layout}"
        }
    ],
    "fields": [
        { "handle": "id", "type": "slug", "required": true, "unique": true },
        { "handle": "title", "type": "string", "required": true },
        { "handle": "uri", "type": "string", "required": true, "unique": true },
        { "handle": "body", "type": "string" }
    ]
}

Entry frontmatter

Each file in streams/data/pages/ carries YAML frontmatter plus a Blade/HTML body:


---

title: Welcome
uri: /
layout: blank

---

@include('partials.topbar')
<h1>{{ $entry->title }}</h1>
Key Role
uri URL path for parse: true routes
layout Blade layout passed to {layout} in the route definition
title Stored field; available on $entry

See Site pages for how this repo wires /, /docs, and /addons.

Markdown documentation

Doc streams set format: md and route to a shared view:

{
    "routes": [
        {
            "uri": "docs/{id}",
            "view": "docs"
        }
    ]
}

Files live in streams/data/docs/ (or {package}_docs/). The entry id matches the filename without extension.

Posts and structured content

Blog or article streams follow the same pattern with different fields — for example slug, published_at, and a relationship to authors. Model fields in stream JSON; store entries in filebase or database sources.

Blocks

Block content is an array field. config.stream turns each item into an entry of a stream, either a stream ID or an inline definition, so every block gets fields, casting, and decorators:

{
    "handle": "content",
    "type": "array",
    "config": {
        "stream": {
            "id": "content_blocks",
            "fields": [
                { "handle": "type", "type": "select", "config": { "options": ["text", "gallery"] } },
                { "handle": "title", "type": "string" },
                { "handle": "body", "type": "string" }
            ]
        }
    }
}

An item saved from an existing entry keeps an @stream key (for example {"@stream": "gallery_blocks", "id": "summer"}) and is restored as that entry when read. To limit what items may be, list types in config.items (for example [{"type": "string"}]).

Each block type can reference another stream or an inline field structure.

Partials via Includes

For reusable view fragments, use Core's Includes API rather than duplicating Blade @include paths in JSON:

Includes::include('sidebar', 'partials.sidebar');

Related