Contensio logo

Installation

Install Contensio into a fresh Laravel application in under 5 minutes — pick the CLI path (for developers) or the browser wizard (for everyone else).

Contensio installs into a fresh Laravel application as a Composer package. Two install paths are available — both do the same thing, pick whichever fits your comfort level:

Requirements

  • PHP 8.3 or later
  • Laravel 13 or later
  • MySQL / MariaDB / PostgreSQL
  • Composer 2.x
  • A configured database (Contensio owns its schema — use a fresh DB or a schema with no table-name collisions)

Step 1 — Set up a Laravel application

If you already have a Laravel app, skip to Step 2.

composer create-project laravel/laravel my-site
cd my-site

Edit .env and configure your database credentials (DB_CONNECTION, DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD). The CLI installer needs these before it can run migrations.

Step 2 — Require Contensio

composer require contensio/contensio

Composer pulls in Contensio and its dependencies (Laravel Fortify, league/commonmark, etc.). This step is the same for both install paths.

Method A — CLI installer

The fastest path for developers. Single command, flag-driven or interactive.

Interactive (you'll be prompted)

php artisan cms:install

The command asks for:

  1. Site name — shown in the admin and in emails (default: your Laravel app name).
  2. Default language — pick from a list of seven seeded languages (en, ro, de, es, fr, it, pt). You can add more from the admin later.
  3. Admin full name
  4. Admin email — validated as a real email address.
  5. Admin password — entered without echo, minimum 8 characters.

Then it:

  • Publishes config files to config/cms.php
  • Publishes core assets (logo, favicon) to public/vendor/cms/
  • Runs all migrations
  • Seeds languages, settings, content types (Page, Post), taxonomies (Category, Tag), block types, roles (Super Admin, Admin, Editor) and permissions
  • Creates your admin account and assigns Super Admin
  • Writes CMS_INSTALLED=true to your .env

You'll see a summary at the end with the admin URL and your email — sign in at /login.

Non-interactive (flags — CI-friendly)

All prompts can be skipped with flags. Perfect for scripted installs:

php artisan cms:install \
    --site-name="My Site" \
    --language=en \
    --admin-name="Ana Popescu" \
    --admin-email="ana@example.com" \
    --admin-password="s3cret-pass"

Mix and match — any flag you leave out will still prompt.

Flag reference

Flag Example Notes
--site-name "My Contensio Site" Stored in settings. Editable later in Configuration → General.
--language en Must match one of: en, ro, de, es, fr, it, pt.
--admin-name "Ana Popescu" Shown in the admin sidebar and activity log.
--admin-email ana@example.com Validated. Used as the login identifier.
--admin-password s3cret-pass Minimum 8 characters.
--skip-migrate (flag) Skip php artisan migrate. Useful if migrations already ran.
--force (flag) Proceed even if CMS_INSTALLED=true already. Re-runs the admin seed with the new credentials.

Re-running the installer

Contensio guards against accidental re-installation: if CMS_INSTALLED=true in your .env, the command refuses to run without --force. The most common reason to re-run is resetting the admin password:

php artisan cms:install --force \
    --admin-email="existing@example.com" \
    --admin-password="new-s3cret"

Existing data is preserved — only the admin user row gets updated (Contensio uses updateOrInsert keyed on email).

Method B — Browser wizard

Non-technical users run composer require contensio/contensio and then visit the site in a browser. Contensio detects that CMS_INSTALLED isn't set and redirects to /install, where a 4-step wizard guides them through setup.

Step 1 — System check

Contensio verifies PHP version, required extensions (pdo, mbstring, openssl, etc.), writable directories, and shows a pass/fail checklist. Fix anything red before continuing.

Step 2 — Database

Enter host, port, database name, username, password. Contensio tests the connection live — you'll see a green check or a clear error.

Behind the scenes, writing these values updates the project's .env (the web installer has write access since you're running the server locally).

Step 3 — Website

  • Site name — used in emails and the default window title.
  • Default language — the language your content is authored in first.

Contensio generates a Laravel app key if one isn't set, saves APP_NAME, seeds the language + settings + content types + taxonomies + block types.

Step 4 — Admin account

  • Full name, email, password (min 8 chars, with confirmation).

On submit, Contensio seeds roles + permissions, creates the user and assigns Super Admin, writes CMS_INSTALLED=true to .env, and redirects to the "complete" page with a link to /login.

When to use this path

  • You're setting up a Contensio site on a managed hosting panel where you can't SSH in.
  • You want the step-by-step guidance with validation at every stage.
  • You're installing for a client who doesn't know what php artisan is.

After install

You're signed in to the admin panel at /admin. From here:

  • Create content — Pages or Posts from the sidebar.
  • Add languages — Configuration → Languages. Each language can have its own slugs, meta, and content.
  • Install a theme — Themes. Ships with one default theme; drop more into packages/themes/ or install via Composer.
  • Install a plugin — Plugins. contensio/plugin-social-connect is a good starter (social login).

Troubleshooting

php artisan cms:install says "already installed"

CMS_INSTALLED=true is already set in .env. Either edit .env to remove it (fresh-install) or re-run with --force (resets the admin account, keeps data).

"Class not found" errors immediately after install

Run composer dump-autoload — sometimes the autoloader needs a kick after Contensio's package provider registers new classes.

Migration fails with a foreign-key error

Contensio's migrations assume a fresh schema. If your database already has tables named contents, users, settings, etc., drop them (or use a different database) and re-run.

Admin panel returns 404 at /admin

Check config/cms.php — the route_prefix defaults to admin. If you changed it (e.g. to panel), the admin lives at /panel. You can override via the CMS_ROUTE_PREFIX env var too.

Login page says "Route [password.request] not defined"

This was a real bug in 1.0.0-rc.1 and rc.2. Fixed from rc.3 onwards — Fortify's service provider is now auto-registered by Contensio. If you hit this, upgrade to the latest ^1.0@rc.

The browser wizard shows "write permission denied" when saving DB credentials

The web installer writes to .env — make sure it's writable by the web server user. On Linux: chmod 664 .env && chown www-data:www-data .env (or equivalent for your stack).

Mail doesn't work after install (password reset, verification)

Install works without SMTP configured. Once installed, go to Configuration → Email and set your SMTP credentials (or choose log mailer during development — emails go to storage/logs/laravel.log).

What's next