A visual block editor for October CMS. Editors build pages from nested blocks and see a live preview in your theme. Content is stored as clean JSON, and your theme keeps control of the markup.
Video tour: https://youtu.be/EyGKp6qE1YI
New in 1.1.0
- Improve with AI: select a text, pick tone, readability or length (or write your own instruction), compare before and after, and undo. Links and classes are protected, and the language of the page is kept.
- Draft from a Word file: upload a .docx, .txt or .md and get a page in blocks, in the language of the document.
- Audience rules: show or hide blocks per visitor group, including RainLab.User audiences, with a "Preview as audience" switch in the editor.
- A/B tests: compare 2 to 6 variants of a block on your own site. Goals, win probability and sample-ratio checks are built in; no cookies by default.
- Faster pages: an optional full-page cache, responsive images, and about 30 % faster rendering.
- Faster editor: pages with 1,000+ blocks stay smooth for typing, moving and undo.
- ZIP import in the editor: restore a page together with its media from a bundle.
- Meloncart: product and category blocks, plus block-editor descriptions.
- Mapbox: optional map style provider, token kept on the server.
- Audit log with real names: see page titles and site names instead of IDs, and search by them.
- Mobile and touch: the editor is comfortable on tablets and phones.
- Security: hardened Word import, safer rate limits behind proxies, and a per-user AI cap.
For editors
- Three-pane editor: structure tree, live preview, and an inspector for each block.
- 30+ blocks: text, images, galleries, video, sliders, cards, accordions, timelines, maps, PDFs, downloads, testimonials, calls to action, forms and layout grids.
- Versions: every save is a version. Compare, restore and pin; the audit log records who changed what.
- Reuse: templates for blocks or whole pages, and Shared Content that updates every page it appears on.
- Scheduling: show a block from or until a date.
- SEO check: a 0 to 100 score for headings, text length, alt text and link text.
- Copy and paste blocks between pages and sites.
- Keyboard first: shortcuts to add, move, duplicate and delete blocks; screen readers announce every structural change.
Works with
- Tailor entries and any backend form.
- RainLab.Pages static pages (2.x and 3.x).
- RainLab.Blog posts.
- RainLab.User audiences for visibility rules.
- OFFLINE.Mall and Meloncart: product and category blocks, plus a one-click shop scaffold for Mall.
- Tailor submission forms (October CMS 4.4+).
- Multisite: one document per site.
All integrations are optional and off by default. Existing content is never converted.
AI (optional, off by default)
- Improve a text, draft a page from a brief or a Word file, or research the web first.
- Translate a document; structure and links stay intact.
- Generate and upscale images.
- Every result shows the changes before it is applied, and is kept in the version history.
- Uses your own OpenAI or OpenRouter key, with a monthly token budget and a per-user hourly cap.
Privacy by default
- YouTube and Vimeo load only after a click.
- Map tiles come through a proxy, so visitors never contact the tile provider.
- The contact form has a honeypot, a rate limit and an optional local captcha. No external service.
For developers
- JSON documents with a published JSON Schema. The format is MIT licensed.
- Override any block's markup in your theme, or register your own blocks. Theme blocks can use rich text, repeater and other fields.
- PHP API, REST API (off by default, token-protected) and CLI for bundles with media.
Requirements
- October CMS 4.x (tested on 4.1 to 4.4), PHP 8.2 or newer.
- No required plugins. Optional: RainLab.Pages, RainLab.Blog, RainLab.User, OFFLINE.Mall, Meloncart. Submission forms need October CMS 4.4.
- AI needs an OpenAI or OpenRouter API key; web research also needs a Firecrawl key.
- Backend in English, German, Spanish, Czech and Polish.
Free theme
Renick.Dawn (free, MIT) shows every block, the shop and the forms.
License and support
Commercial license per installation; local evaluation is free. Docs: renick.io/en/content-plugin. Questions: talk.octobercms.com. Bugs and contact: renick.io/en/kontakt.
Installation via Command Line
php artisan plugin:install Renick.Content
Renick.Content
Block-based content editing for OctoberCMS 4.3. A content document is a list of typed blocks (heading, rich text, image, button, section, and more) stored as JSON in a host field, edited with a backend block editor, and rendered on the frontend through a fallback-safe renderer.
Official landing page: https://www.renick.io/de/content-plugin
Install
The plugin registers itself through the standard OctoberCMS discovery. With the
plugin in plugins/renick/content:
php artisan october:migrate # boots the plugin php artisan plugin:list # shows: Renick.Content
Usage
Tailor entries
Add a contenteditor field to a blueprint:
fields:
content:
label: Content
type: contenteditor
The field stores the document JSON in a longText column and renders the block
editor in the entry form.
Backend forms
The same widget is available to any backend form as type: contenteditor.
Frontend rendering
Render a stored document on a CMS page with the component:
[renickContent]
==
{% component 'renickContent' document=post.content %}
…or inline with the Twig function anywhere in a theme:
{{ content_render(post.content)|raw }}
Both funnel through BlockRenderer, which resolves each block's partial
theme override → plugin default → safe placeholder and never throws on a
missing or unknown block (D10): the offending block degrades to an HTML comment
(plus a visible card in debug) while its neighbours still render.
Blocks
| Handle | Group | Purpose |
|---|---|---|
heading |
text | h1–h6 heading |
richtext |
text | HTML rich text, edited with a TipTap editor in the Inspector |
quote |
text | Blockquote with author + role |
image |
media | Media image with alt, caption and optional link |
gallery |
media | Multi-image field (array or one path per line), optional captions |
video |
media | YouTube/Vimeo privacy embed or media-library <video> |
slider / slide |
media | Slideshow container and its slides |
pdf |
media | Embedded PDF from the media library |
map |
media | Privacy-proxied map (tiles served through the plugin) |
button |
components | Labelled link/button |
cta |
components | Call-to-action block |
card |
components | Card with image, text and link |
accordion / accordion-item |
components | Collapsible sections (with an FAQ variant) |
timeline / timeline-item |
components | Vertical timeline and its entries |
anchor |
components | Named anchor / link wrapper |
shared |
components | Reference to a reusable Shared Content document |
placeholder |
utility | Named slot bound to a Custom Script (JS) |
section |
layout | Container that nests child blocks |
grid / column |
layout | Column container (2/3/4) and its columns |
card-grid |
layout | Grid of cards |
spacer |
utility | Explicit vertical whitespace (xs–xl) |
Every block also carries generic settings (spacing top/bottom, width,
CSS class, anchor id — rendered as rc-* utility classes) and visibility
(on/off toggle, show-from / show-until schedule, evaluated server-side at
render time). The document format is published as JSON Schema in
schema/document-v1.json.
Each block is a YAML definition plus a default partial in
blocks/<handle>/. A theme may override a partial at
partials/renick-content/<handle>.htm; the default guarantees rendering never
breaks.
Layout
classes/ BlockDefinition, ContentDocument, VisibilityRules, BlockManager, BlockRenderer,
StaticPagesIntegration, RainLabBlogIntegration
blocks/ block definitions (YAML) + default partials
console/ Artisan commands (export/import bundle, prune versions/proxy cache, reindex media, seed demo)
formwidgets/ ContentEditor form widget (mount partial; UI ships in assets/dist)
contentfields/ ContentEditor Tailor content field
components/ Content component (renickContent)
assets/src/ Editor source — TypeScript + React 18 + TipTap 3 (see INITIAL_PLAN.md#25-the-editor)
assets/dist/ COMMITTED editor bundle (single ESM file + css)
tests/unit/ PHPUnit suite
Editor build
The backend editor is a TipTap 3 / React island bundled with Vite (pnpm).
Consumers never build anything — assets/dist is committed and shipped.
cd plugins/renick/content pnpm install pnpm run typecheck && pnpm test # TS + Vitest (converter round-trips, fuzz, constraints) pnpm run build # rebuild assets/dist (CI fails if stale)
AI & REST API
AI features are disabled by default. Configure them under
Settings → Renick Content AI: provider (OpenAI, OpenRouter, or the offline
mock driver for testing), API keys (encrypted at rest), per-feature models,
an image-generation model and storage target, a monthly token budget (warn-only)
and the Firecrawl research toggle.
In the editor toolbar the AI menu offers Translate… (values only —
structure, ids and URLs stay untouched), Draft from brief… and Research &
draft… (Firecrawl-gathered sources; requires the privacy toggle); the image
block can generate images from a prompt. Every AI result shows a block-diff
confirmation modal before it is applied, and records an auditable
ai_translate / ai_draft version.
Custom Scripts (JS bound to a placeholder block) can be AI-generated behind
a review gate: generated code is loaded into the form for the admin to review
and only becomes public once they save it, with create/update logging and a
created_by/updated_by audit trail.
The REST API is off by default. Enable it plus a bearer token in the AI
settings; endpoints live under /api/renick/content/v1:
GET /document?host_type=&host_id=&field= # document + media manifest
PUT /document # write (normalize + validate)
GET /document/bundle?host_type=&host_id=&field= # export document + media as a ZIP
POST /document/bundle # import a ZIP bundle
POST /translate # {host…, target_language}
POST /draft # {brief, template_id?}
POST /duplicate # {document} → re-id'd copy
GET /templates
GET /versions?host_type=&host_id=&field=
POST /restore # {host…, version_id}
All requests: Authorization: Bearer <token>. Writes snapshot the previous
state first and record the action in the audit log. The same service classes
back the editor (Renick\Content\Classes\Content facade for PHP consumers).
The group is rate-limited (default 60 requests/minute, keyed by token then
client IP) and enforces body-size caps (2 MB for a document, 50 MB for a
bundle → HTTP 413 on overflow). All limits are overridable via env or
config/renick/content/limits.php — see config/limits.php.
Plugin integrations
Two opt-in integrations let the block editor take over content fields in other plugins, configured under Settings → Content Editor → Integrations. Each switch is inert unless the matching plugin is installed, and neither is a hard dependency:
- RainLab.Pages — edit a static page's content with the block editor. The swap happens only for pages whose markup is empty or already a block document; existing HTML pages keep the rich editor untouched.
- RainLab.Blog — edit a blog post's
contentwith the block editor. Same rule: only empty or already-block posts switch; existing Markdown posts are untouched. The renderedcontent_htmlis generated from the block document on save, so the stock RainLab blog components keep working.
Command line
Artisan commands (run from the October install root):
php artisan renick:content:export-bundle --host=… --id=… [--field=content] [--out=file.zip] [--dry-run] php artisan renick:content:import-bundle --host=… --id=… --in=file.zip [--overwrite-media] [--force] [--dry-run] php artisan renick:content:prune-versions [--days=180] # delete unpinned versions older than N days php artisan renick:content:prune-proxy-cache # clear expired map-tile / video-thumbnail cache php artisan renick:content:reindex-media # rebuild the media usage index php artisan renick:content:seed-demo [--section=Content\\Article] # demo entry with every block
Both bundle commands accept --dry-run to print exactly what they would
read/write without touching the filesystem or the database.
License
Renick.Content is proprietary, commercial software — source-available, not open source. Being able to view the source code does not grant a right to use it. Any production use requires a valid, paid license per installation / per site, purchased from the Licensor. Local, non-production evaluation is permitted.
The block-based content format (its specification and schema) is separately licensed under MIT, so authored content stays portable and interoperable. The plugin implementation itself remains proprietary.
See LICENSE.md for the full terms. Copyright © 2026 Renick
Büttner. Licensing enquiries: complains@renick.io.
-
This plugin has not been reviewed yet.
-
| 1.1.2 |
Adds rc_partial() so block partials can include each other, and rc_entries valid_through: active to hide expired entries. No schema changes. Oct 25, 2026 |
|---|---|
| 1.1.1 |
Fixes: entries without an explicit publish date sort and show by their publish date (rc_entries accepts order published_at_date); the structure tree block menu is no longer clipped; repeater entries are no longer titled after a dropdown default and show a localized Untitled. No schema changes. Oct 25, 2026 |
| 1.1.0 |
Visibility rules with a RainLab.User audience rule and an audience preview, server-side A/B tests on blocks, an optional full-page cache and faster rendering, responsive images, Meloncart integration, and rate-limit hardening with a per-user AI cap. A lot of quality of life improvements from AI integration to editor performance. Oct 21, 2026 |
| 1.0.10 |
Fixes: plugin rollback no longer drops the core-owned site_root_id column; REST PUT /document rejects a missing document instead of wiping content; Tailor preview renders [section] pages; RainLab.Pages 2 + Translate saves a translated static page into its locale. No schema changes. Oct 15, 2026 |
| 1.0.9 |
Block availability: disable blocks globally or per site (Settings > Content > Editor) or via the renick.content.resolveBlockAvailability event. Disabled blocks are not insertable and rejected on save and via Content::put; existing ones keep working. RENICK_CONTENT_ENFORCE_BLOCK_POLICY switches off the Content::put check. No schema changes. Oct 15, 2026 |
| 1.0.8 |
Fix issue on case-sensitive filesystems. Sep 21, 2026 |
| 1.0.7 |
!!! Breaking: the Twig filter |content is now |rc_blocks — replace it wherever a template renders a block document. Adds OFFLINE.Mall and Tailor submission form (October 4.4+) integrations, a Tailor entry list block, RainLab.Pages 3.x support, map tile cache limits, a keyboard-first editor, tabbed settings, CSS class presets, an AI model picker and switches to hide the Settings and SEO tabs. Fixes the editor on October 4.1 and closes two security gaps (public form uploads, unguarded settings actions). Repairs the slugs of existing site copies; no schema changes. Sep 19, 2026 |
| 1.0.6 |
Fixes (no schema changes): Shared Content resolves across sites; block dropdowns persist their selection; applying an AI, History or imported document survives block-hierarchy constraints; AI drafts respect block nesting, keep the hero full-width and no longer time out on long research runs; section backgrounds render full-bleed with contained content; German "Button" label; toolbar guarded against editor re-init. Aug 02, 2026 |
| 1.0.5 |
AI batch: copyright guard scrubs external image URLs from drafts (opt-out checkbox), draft scope selector (section/small/large), .docx/.txt/.md template-document upload, Lucide icon seeding with sanitation, width/spacing defaults on drafted blocks, a busy dialog during AI runs, image-dialog spinner + AI upscaling, and OpenRouter (Gemini) image generation. Editor: structure-tree burger menu with move up/down and flush-right actions, Editor Settings markup classes as one-click class suggestions. Forms: optional fully local arithmetic captcha (stateless signed tokens). No schema changes. Aug 02, 2026 |
| 1.0.4 |
Editor page-finder fields now preserve October page references through repeaters and expose a native selector action when October's page finder is available. Shipped navigation fields use pagefinder values end to end, and the renderer resolves CMS and Tailor page references without leaking tokens. No schema changes. Aug 02, 2026 |
| 1.0.3 |
Multisite theme seeds can now create the sites they target, so a fresh install imports the demo content instead of skipping every row. No schema changes. Jul 28, 2026 |
| 1.0.2 |
Cross-install imports now land on the record you addressed: a Tailor host id alone was ambiguous across blueprints, so an import could silently overwrite an unrelated entry. Site restrictions and shared-content references survive a move between installations. Ships third-party license notices, shows them in a new License section in the settings, and documents the Marketplace as the single install route. No schema changes. Jul 28, 2026 |
| 1.0.1 |
Release-chain fix: the distribution repository now carries a matching git tag, so Composer can resolve the published version range instead of only dev-main. No schema or behaviour changes. Jul 28, 2026 |
| 1.0.0 |
Initial 1.0.0 release of Renick.Content — the complete block-based content editor for OctoberCMS 4.3 (see CHANGELOG.md for the full feature set). Creates every plugin table and its supporting indexes and audit columns in schema-dependency order. Jul 16, 2026 |




