orchestra/story
Orchestra Story is a Laravel CMS package for Orchestra Platform that adds a simple content publishing layer for stories, pages, and posts. It provides Eloquent-backed models, migrations, and admin-friendly workflows for managing structured content.
Content model covering both posts and pages, admin CRUD, slug generation, publication status, Markdown authoring via SimpleMDE, and publishable migrations/config/views. Frame the comparison honestly: one sprint of engineering to ship a minimal posts/pages module we fully own vs. near-zero upfront cost plus a permanent, single-owner upgrade obligation tied to Orchestra releases. Do not evaluate Story as a standalone CMS product — it isn't one.StoryServiceProvider now extends Orchestra\Foundation\Support\Providers\ModuleServiceProvider, ACL moved to Orchestra\Support\Facades\ACL, and AuthServiceProvider/ContentPolicy replace the removed CanManage middleware. Adopting Story is functionally a decision to run Orchestra as our admin/foundation layer. Sequence the platform decision first; Story is a downstream consequence on the roadmap, not an independent line item.composer require, is the real price of the "buy."CanManage) to policies/gates (ContentPolicy) sets the precedent for how every other module in our admin enforces permissions. Decide this pattern once, deliberately, with a named owner — it will be copied.Content::newPostInstance() / newPageInstance() plus url() / editUrl() / deleteUrl() make it cheap to add content types and to link content from adjacent modules (morph map via getMorphClass()). Relevant if the roadmap is blog + docs + landing pages sharing one authoring model; not relevant if we need typed/structured content.CanManage, Content::$morphClass) and deprecates Acl aliases — evidence the public API is still settling. Zero dependents and a 0.3 score mean no community answers, no third-party extensions, and no one else catching the next breaking change. Budget for self-support and prohibit deep customization against model internals.Consider it when:
StoryPlugin.Look elsewhere — or build the ~one-sprint minimal module — when:
Decision rule for the room: adopt only if (a) Orchestra is already in the stack or independently justified, (b) requirements are posts/pages/status/slugs for at least two quarters, and (c) an internal owner is named before the first install.
To executives (one paragraph): Story is a lightweight CMS layer that gives us articles and pages, drafts and publishing, slugs, and Markdown editing essentially for free — provided we are already standardizing on Orchestra Platform for our admin layer. The trade is straightforward: near-zero build cost today, in exchange for a recurring upgrade obligation tied to every Orchestra release and the need to name an internal owner. It does not give us content versioning, approval workflows, localization, or structured content — so if any of those are on the near-term roadmap, this is the wrong tool and we should say so now rather than fund custom work later. This is a platform decision with a content feature attached, not a standalone CMS purchase.
To engineering (the working contract):
orchestra/platform (or orchestra/foundation) is installed and pinned to a 3.2-compatible line. If not, stop — do not "port" Story to plain Laravel.Orchestra\Story\Model\Content from our controllers and treat Story as a content source. Never build presentation routes inside Story.title, body, slug, status, and the URL helpers. Keep an interface or DTO between Story and our views so migration off is not a rewrite. Avoid extending Content or overriding internals.StoryPlugin is the only sanctioned customization point for menus, assets, and admin screens. Vendor edits are merge conflicts on the next Orchestra bump.CanManage removal is the highest-risk item — a misregistered policy fails silently, either 403-ing legitimate editors or falling open. Stage the upgrade and test every content route against every role, with positive and negative cases per ability (view, create, update, delete) in ContentPolicy. Second risk: $morphClass removal — switch to getMorphClass() with an explicit Relation::morphMap() and a regression test on any relationship traversing content.Acl aliases with Orchestra\Support\Facades\ACL; re-publish SimpleMDE assets (v1.9.1) and clear caches so the editor doesn't silently run an old build; rebase any custom providers on ModuleServiceProvider to avoid double-registered routes and views.url() after rename in tests — a broken live URL is the most visible failure after an auth regression.Ask: approve the Orchestra platform sequencing decision first; if approved, treat Story as a scoped add-on with a one-sprint integration, a named owner, and a documented "no list" (no versioning, workflow, localization, or structured content) signed off by product.
How can I help you explore Laravel packages today?