typicms/base
TypiCMS Base is the core foundation for TypiCMS, a modular, multilingual content management system built on Laravel. It provides shared CMS infrastructure, localization, and module support for building flexible, maintainable websites.
Architecture fit. TypiCMS is an opinionated, Laravel-native application platform rather than a drop-in library. typicms/base is the application skeleton: it composes a core plus a set of self-contained feature modules (pages, news, events, projects, places, partners, files, galleries, menus, translations, users, roles, settings, blocks, sliders) distributed as separate Composer packages. Each module ships its own models, migrations, controllers, Blade views, routes, translations, and service provider, and registers into the host app through Laravel's provider/config conventions. Internally it leans on the repository pattern, presenters, and a per-module facade, with a server-rendered Blade + Bootstrap admin panel. This is a strong fit for a team that wants a working multilingual editorial back office on day one and is comfortable reading Laravel idioms; it is a poor fit for API-first/headless delivery, SPA-fronted products, event-sourced or DDD-structured codebases, or teams standardized on Symfony/Next.js.
Integration feasibility. Low friction for greenfield, materially higher for retrofits. The 0 dependents figure is a signal, not a defect: nothing composer requires typicms/base because it is a top-level project, and you consume it by forking/cloning and building on top rather than by adding it to an existing composer.json. Attempting to graft the module stack into a mature Laravel app means reconciling auth, routing, asset pipeline, and migration ordering with existing conventions — a multi-week integration with real regression surface. The pragmatic pattern for an existing estate is to run TypiCMS as a discrete application (subdomain or path behind a reverse proxy) with shared identity via SSO, and treat content as a bounded context.
Technical risk. The dominant risk is bus factor. The project is effectively maintained by a very small core, with a modest star count and no downstream dependents creating pressure for backward compatibility. Secondary risks: Laravel version lag (the platform has historically trailed current Laravel majors, which compounds security patch exposure on transitive dependencies); the multilingual data model, which typically stores per-locale content as discrete columns (title_en, title_fr) rather than a translations table, making locale addition a schema migration; a jQuery/Bootstrap admin UI that is functional but not modern; and no formal LTS or published security-response policy. MIT licensing removes legal friction and permits a private fork with no obligation to upstream — the correct posture here.
Key questions to resolve before commitment.
Stack fit. Requires PHP 8.x, a Laravel-supported database (MySQL 5.7+/8 or Postgres), and standard Flysystem storage for media (local or S3-compatible). Image handling implies GD or Imagick in the runtime image. Front-end build assumes Node tooling for asset compilation; the admin does not require a JS framework. It slots cleanly into a conventional PHP-FPM + Nginx + opcache deployment and into containerized platforms without bespoke infrastructure.
Migration path. Sequence it as a fork, not an install. Clone the skeleton, prune modules the product does not need (every retained module is migration, route, and admin-surface you now own), pin the lockfile, and immediately establish the fork as the source of truth in our VCS with a documented upstream remote for cherry-picking. For an existing application, do not merge codebases: stand TypiCMS up as a sibling service, front it with the same edge proxy, and federate auth. For content, plan a one-way migration into TypiCMS's schema early — its locale-as-column model means the target schema must be settled before the import is written.
Compatibility. Build a version matrix on day one: PHP × Laravel × DB driver × upstream tag, verified in CI with a smoke test that boots the app, runs migrations, renders one public page and one admin screen in two locales. Confirm driver support explicitly rather than assuming Postgres parity, since CMS packages frequently test a single driver. Verify the translatable/sluggable dependency chain against our PHP version — these are the components most likely to break on upgrade.
Sequencing.
Maintenance. Ongoing cost is fork maintenance, not dependency upgrades. Budget a recurring allocation (roughly 10–15% of one engineer) for: reviewing upstream releases, cherry-picking security-relevant patches, updating transitive dependencies, and re-running the compatibility matrix. Divergence is the enemy — keep customizations inside our own modules and avoid editing vendored code so upstream patches remain applicable.
Support. Community-only: GitHub issues and documentation, no commercial SLA, no vendor to escalate to. The realistic model is named internal ownership with a documented runbook, plus a contingency retainer with a Laravel consultancy for the two or three areas we are least likely to staff (upgrade archaeology, media pipeline, permissions). Do not plan on upstream responsiveness for time-critical defects.
Scaling. The app is stateless and scales horizontally in the conventional way: multiple PHP-FPM pods behind a load balancer, opcache enabled, sessions and cache in Redis, media on object storage behind a CDN. Two scaling hazards specific to this architecture: the repository/presenter pattern invites N+1 queries on listing pages with related content, so instrument query counts on the highest-traffic templates before launch; and image derivative generation is CPU-bound on upload, so push it to a queue worker pool rather than the web tier. Full-page response caching delivers the largest win for anonymous traffic, which is the dominant CMS workload.
Failure modes to design against.
Ramp-up. A competent Laravel engineer is productive on built-in modules within 1–2 weeks and can author an idiomatic custom module in 3–4 weeks. The binding constraint is not Laravel familiarity but learning the module conventions, which are under-documented relative to the framework itself — assign the first custom module as a paired exercise and capture the result as an internal contributor guide. Plan for one designated owner of the fork and upgrade process; that role is the single point of failure this evaluation is most concerned about.
How can I help you explore Laravel packages today?