bkwld/decoy
Decoy is a Laravel package for building custom admin interfaces and CMSs. It provides model-driven admin controllers, form and listing builders, localization, and a clean Vue-powered UI, so you can manage content without a separate CMS.
Architecture fit. Decoy is not a composable library — it is an opinionated CMS framework layered on top of Laravel that assumes ownership of the admin application surface. Content types are defined as Eloquent models, admin controllers extend Decoy\BaseController, admin views are Twig-rendered (via TwigBridge) rather than Blade, and the package brings its own routing conventions, slug/position/nesting behaviors, localization hooks, and image pipeline (Croppa). That makes it a strong fit only for a single use case: a Laravel app whose primary need is an editor-facing CRUD back office over Eloquent models, where the team is willing to accept Decoy's conventions end-to-end. It is a poor fit as a drop-in admin component inside an existing application with its own admin shell, design system, or API-first front end.
Integration feasibility. Practically, consumption is composer require on a Laravel 5.x codebase, or a fork plus vendoring on anything newer. The last release (July 2018) predates Laravel 6's semantic-versioning shift and PHP 8, and its dependency tree — TwigBridge, Croppa, and sluggable/nestable-style helpers of that era — is the real integration constraint, not Decoy's own code. Expect composer update resolution failures against Laravel 9/10/11 and PHP 8.1+, and expect runtime breaks even if forced. Feasibility is therefore high on a legacy Laravel 5.4–5.8 estate already running Decoy-adjacent patterns, medium for a time-boxed proof of concept, and low for greenfield work.
Technical risk. Concentrated in four areas: (1) Abandonment — no releases in ~7 years, a single originating agency, ~300 stars, no security advisory channel; any CVE in Twig or the image stack is yours to fix. (2) Platform EOL — the target Laravel and PHP versions are out of security support, which is a compliance finding in most regulated environments independent of Decoy itself. (3) Coupling — because Decoy drives schema assumptions from models and owns admin routing/views, it is hard to partially adopt or partially remove; the exit cost is a rewrite of the admin layer, not a swap. (4) Hidden surface — Twig-in-Laravel, image processing, and nested-set ordering each introduce failure modes that are invisible until production traffic or content volume arrives.
Key questions. What Laravel and PHP versions must this run on, and is EOL acceptable to security/compliance? Is the deliverable an internal editorial back office (Decoy's sweet spot) or a customer-facing product surface? Are content models already Eloquent, or would we be reshaping the domain to fit Decoy's assumptions? Does the content need localization, ordered/nested collections, and image derivatives — i.e., are we using the features that justify the framework? Who owns a fork, and is there budget for one? What is the replacement path if we adopt and upstream stays dead?
Stack fit. Viable target is Laravel 5.4–5.8 on PHP 7.1–7.3 with MySQL, Twig 1.x/2.x, GD or Imagick for Croppa, and local or S3-backed filesystem. Anything on Laravel 9+ or PHP 8.1+ should be treated as out of scope unless a fork is funded. Confirm the exact supported matrix against the package's composer.json and a spike before committing — do not infer it from the README.
Migration path. Two realistic paths. Adopt (legacy estate only): pin the Laravel/PHP versions, vendor a fork under an internal namespace, and run a dependency audit (composer audit, SCA scan) before any exposure. Modernize: fork and upgrade in steps — PHP 7.4 → 8.x first with characterization tests around admin CRUD, then Laravel 6/7/8/9 incrementally, replacing TwigBridge and Croppa with maintained equivalents (Blade or Twig 3, Glide/Intervention) rather than patching them. Where the surrounding app is already modern, use a strangle pattern: leave Decoy serving the existing editorial workflow against the shared database, and build new admin surfaces beside it, migrating content types one at a time. Avoid a big-bang fork upgrade; the failure blast radius is the entire back office.
Compatibility. Validate per area rather than as a whole: framework version, Twig version, image driver and storage adapter, database driver and collation, and admin UI assets (Decoy's admin chrome is Bootstrap-era and will look dated against any current design system — budget for cosmetic divergence or accept it for internal tools).
Sequencing. (1) Confirm target stack and EOL tolerance with security/compliance. (2) Run a one-week spike on a matching Laravel version: define two models, exercise slug/position/image/localization, and measure. (3) Inventory which Decoy features are actually load-bearing. (4) Decide adopt-vs-fork-vs-replace with a costed fork estimate. (5) If forking, stand up CI with characterization tests before touching dependencies. (6) Define the retirement or upgrade trigger up front.
Maintenance. This is the dominant cost. With no upstream, the fork becomes a first-class internal product: dependency updates, security patching, Twig/image-library migrations, and PHP major-version work all land on your team. Rough order of magnitude is ongoing fractional-engineer effort, spiking at each PHP or Laravel upgrade cycle. Budget it explicitly; teams that treat it as "a Composer package" under-resource this and get stuck on an unpatchable stack.
Support. No vendor, no SLA, no advisories. Internal runbooks, an owner, and a documented "if upstream stays dead" decision are mandatory. In regulated contexts, the EOL Laravel/PHP pairing will likely fail policy review regardless of Decoy's quality.
Scaling. The admin is server-rendered and fine for small editorial teams (tens of concurrent editors). Pressure points are synchronous image processing — CPU and disk I/O spike on bulk uploads; move to a queue or external image service — plus nested-set and position-reordering queries that degrade with large ordered collections, and the absence of a built-in caching layer for content reads. Media on local disk does not survive horizontal scaling; plan object storage early.
Failure modes. Image processing failures (missing driver, permissions, disk full) surface as broken admin saves; Twig template errors take down the whole admin rather than one widget; slug collisions and position race conditions corrupt ordering under concurrent edits; model-driven schema assumptions drift silently when the domain changes; and any transitive CVE has no patch path but you. Each needs a detection and rollback story before launch.
Ramp-up. Laravel developers become productive in days, but Decoy's conventions (base controller lifecycle, $this->data view contract, Twig instead of Blade, package view overriding) are undocumented beyond the README and examples, so expect a week of ramp per engineer and a real bus-factor risk. Write internal onboarding docs and keep at least two people fluent; a single-knowledge-holder is the most likely operational failure here.
How can I help you explore Laravel packages today?