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:
- CLI installer — one command, great for developers and CI pipelines.
- Browser wizard — guided 4-step form for non-technical users.
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:
- Site name — shown in the admin and in emails (default: your Laravel app name).
- 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. - Admin full name
- Admin email — validated as a real email address.
- 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=trueto 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 artisanis.
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
- First login — a tour of the admin panel.
- Plugins & themes — extend Contensio with ready-made plugins and themes.
- Developers → Getting started — if you want to build your own plugin or theme.