typo3/cms-frontend
TYPO3 CMS Frontend is the system extension that renders TYPO3 websites: it resolves sites and pages, processes TypoScript and content elements, handles routing and frontend caching, and delivers HTML responses. Essential for building and serving frontend pages with TYPO3.
What this package actually is. typo3/cms-frontend is a read-only subtree split of typo3/sysext/frontend from the TYPO3 Core monorepo. It is the request-handling and page-rendering layer of TYPO3: page resolution from the page tree, TypoScript parsing, content element rendering, and Fluid template output. It is not an API package, not a headless content-delivery package, and not a Laravel package. The Dependents: 0 signal is the important one: nothing on Packagist consumes this package directly, because it is only ever installed transitively via the typo3/cms metapackage. Installing it alone yields a non-functional set of classes with no bootstrap, no database schema, and no configuration.
Architecture fit — poor for Laravel-native work, viable only as an external service. The central TPM finding is that Laravel and TYPO3 each ship a competing application kernel. TYPO3 boots via SystemEnvironmentBuilder::run() → Bootstrap::init() → Core\Http\Application → request handlers → page resolver → TypoScript → Fluid. Laravel boots via HTTP kernel → global/web middleware → router → controller → Blade. You cannot nest one inside the other without effectively running two applications in one process. Every integration pattern that looks "clean" on a slide (shared middleware, shared auth, shared ORM) degrades into a bridge layer that only one team understands.
What this package does give you, if you already run TYPO3: the content-modelling engine (flexible content types, page tree, workspaces/versioning, media management, multilingual routing with fallback chains, and a mature page cache). Those are genuinely expensive to rebuild and are the real justification for the acquisition cost. The value is backend content operations, not the frontend code itself.
Licensing is a first-order technical risk, not a legal afterthought. GPL-2.0 in a Laravel project — Laravel is MIT, and most commercial Laravel codebases are proprietary — creates a real derivative-work question that no architecture diagram resolves. Any distribution of the combined application, and arguably any tight in-process linking, obliges you to publish under GPL-2.0. The safe pattern is strict process/service separation (TYPO3 runs as its own GPL-licensed service, Laravel talks to it over HTTP). That constraint should be decided by legal before engineering spends a sprint on a proof of concept.
Technical risk register (TPM view):
| Risk | Severity | Why it matters to the roadmap | Mitigation |
|---|---|---|---|
| Two application kernels, one product | Critical | Every feature needs a decision about which stack owns it; roadmap velocity drops | Isolate as separate service on a subdomain; never link in-process |
| GPL-2.0 contamination | Critical | Can block distribution, licensing, or M&A diligence | Legal review up front; keep it behind a network boundary |
| Dependency/version deadlock | High | TYPO3 LTS pins PHP ranges and older Symfony majors; Laravel moves yearly | Separate Composer projects, separate containers, pin independently |
| Dual skill requirement | High | Hiring and on-call coverage both get harder | Budget for a TYPO3 specialist (internal or agency retainer) |
| Cache incoherence | Medium–High | TYPO3 page cache vs Laravel cache vs CDN; stale or purged-at-wrong-time content | Single cache-invalidation owner; tag-based purge contract |
| Performance/blast radius | Medium | One slow TYPO3 render can stall a Laravel page if called synchronously | Async fetch + queued refresh + fallback content |
| Maintenance of a read-only mirror | Low | It is a Core subtree split, so upgrades come with TYPO3 LTS, not from this package | Track TYPO3 LTS release notes, not this repo |
Key questions to resolve before committing:
cms-frontend.Stack fit. The honest framing for stakeholders: this is a coexistence decision, not an integration decision. Three patterns are available, and they are not equally cheap.
| Pattern | What it means | TPM verdict |
|---|---|---|
| A. Reverse-proxy coexistence | TYPO3 serves /content and /typo3 (editorial backend); Laravel serves everything else; Nginx routes by path |
Lowest risk, fastest to value, but user-visible seams (two design systems, two session models) and a shared CDN/cache story to design |
| B. Headless consumption | Laravel owns 100% of rendering; fetches content from TYPO3 over a JSON API | Best long-term architecture; but this package does not deliver the API — you must build or buy one, which is the real project |
| C. In-process embedding | Load TYPO3 inside Laravel (shared DB, shared routing) | Reject. Kernel collision, GPL exposure, and dependency deadlock make this unmaintainable within two upgrade cycles |
Recommend A as the pilot, B as the target, with an explicit gate between them. Pattern A is how you get an editorial team and an engineering team to agree on something within a quarter.
Migration path.
composer why-not typo3/cms will confirm the conflict surface immediately. Output: go/no-go with a costed TCO, not a prototype.vendor/, no shared Composer project, no shared public/. This single decision eliminates most of the failure modes below.fe_users ↔ Laravel users synchronisation as a first step. Start with public content only; use TYPO3's own frontend-user system for gated TYPO3 content, or issue Laravel tokens and pass them to the API. User-table merging is a multi-quarter trap.Compatibility notes that will bite.
replace directives do not, they merely hide it.tt_content, pages, sys_file* schemas are TYPO3-owned. Never point Eloquent at them. Consume via API.fileadmin/ and generated typo3temp/ assets need a stable public origin. Do not symlink them into Laravel's public/ — it couples deploys and breaks on containerised filesystems. Serve them from the TYPO3 origin or push to object storage./typo3/ (TYPO3 backend) and /admin (Laravel) on distinct hostnames or paths at the proxy, or you will debug a 404 that is actually a precedence bug for an afternoon.Sequencing rule of thumb: solve the content contract before the authentication contract, and the deployment boundary before either. Teams that start with auth and shared databases spend the budget on plumbing.
Maintenance. You are signing up for two release cadences, two dependency graphs, and two security-patch streams. TYPO3 LTS ships roughly every 18 months with a defined support window; Laravel ships a major annually with ~2 years of fixes. Neither aligns. Practically, this means a standing quarterly line item: align PHP versions, verify the content API contract still holds, re-run the cross-stack smoke tests. Budget it explicitly — teams consistently under-forecast this and it becomes the reason the integration is quietly abandoned in year two.
Support and staffing. The scarcest resource is a person who is comfortable in both TypoScript/Extbase and Laravel/Eloquent. That person is rare and expensive, and if they leave, you have an orphaned integration. Mitigations: (a) contract a TYPO3 agency for the TYPO3 side so Laravel staff never need deep TYPO3 knowledge; (b) keep the content API thin and schema-tested so the boundary is the only thing anyone needs to understand; (c) write the runbook for the boundary, not for TYPO3 internals. Also note: TYPO3's community support channel is Forge and Slack, not the Laravel ecosystem — your normal escalation path does not exist for half the stack.
Scaling. The two halves scale differently and must be scaled independently. TYPO3's page cache is fast but invalidation-driven (content edits purge pages), so it wants a warm cache and a generous memory footprint. Laravel wants horizontal replicas behind a load balancer. Design the content API to be cacheable by URL and taggable by content ID, so a TYPO3 edit can purge the right Laravel/CDN keys. Without a tag-based purge contract you get either stale content (bad) or a 5-minute TTL (worse for large sites). Watch the synchronous call path — any Laravel request that renders by calling TYPO3 inline inherits TYPO3's tail latency; prefetch and queue instead.
Failure modes to design against, in likelihood order:
fe_users diverge; users see content they should not, or lose it. Avoid by: never merging user tables; single identity issuer.Ramp-up. A Laravel developer needs roughly 2–4 weeks to be productive against the content API boundary (fine), and 2–4 months to be productive in TypoScript/Fluid/Extbase (expensive). Plan the team shape accordingly — the goal is that most engineers only ever touch the boundary. For the pilot, assume 1 TYPO3 specialist + 2 Laravel engineers for a quarter, and treat the second quarter as the real cost once edge cases (translations, workspaces/drafts, media variants, gated content) surface. If the pilot's first section takes more than six weeks end-to-end, that is a signal the boundary is too fat and should be re-cut before scaling to more sections.
Bottom line for the decision record: treat typo3/cms-frontend as a signal that "TYPO3 is in scope", not as an adoptable package. Its value is the TYPO3 content model and editorial tooling; its cost is a second runtime, a GPL boundary, a dual skill set, and a permanent integration tax. Approve it only if TYPO3 already exists in the estate or the editorial requirements genuinely demand its feature set — and only with a network-separated, API-contracted architecture, a named owner for the boundary, and a documented exit ramp (content exported to JSON, frontend rendering already 100% Laravel) so that replacing TYPO3 later is a backend swap rather than a rebuild.
How can I help you explore Laravel packages today?