Installation Guide
TallCMS can be installed in two ways: as a **standalone application** (full CMS) or as a **Filament plugin** (add to existing app).
| Path | Best For |
|---|---|
| Plugin | Existing Laravel/Filament apps — add CMS features via Composer |
| Standalone | New projects — full CMS with themes, plugins, web installer, and auto-updates |
System Requirements
| Requirement | Version |
|---|---|
| PHP | 8.2 or higher |
| Laravel | 11.0 or 12.0 |
| Filament | 5.0 |
| Database | MySQL 8.0+, MariaDB 10.3+, or SQLite |
| Web Server | Apache 2.4+ or Nginx 1.18+ |
| Node.js | 18.0+ (for asset compilation) |
Required PHP Extensions
- OpenSSL
- PDO (with MySQL/SQLite driver)
- Mbstring
- Tokenizer
- XML
- Ctype
- JSON
- BCMath
- Fileinfo
- GD or Imagick
Plugin Installation
Add CMS features to your existing Laravel/Filament application.
Step 1: Install the Package
composer require tallcms/cms
This will install TallCMS and its dependencies. If Filament is not already installed, it will be pulled in automatically.
Step 2: Set Up Filament Panel
If you don't have a Filament panel yet:
php artisan filament:install --panels
Step 3: Configure User Model
Your User model must use the HasRoles trait from Spatie Permission:
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
use HasFactory, HasRoles, Notifiable;
// ...
}
Step 4: Register the Plugin
Add TallCmsPlugin to your panel provider (e.g., app/Providers/Filament/AdminPanelProvider.php):
<?php
namespace App\Providers\Filament;
use Filament\Panel;
use Filament\PanelProvider;
use TallCms\Cms\TallCmsPlugin;
class AdminPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
->default()
->id('admin')
->path('admin')
// ... other configuration
->plugin(TallCmsPlugin::make());
}
}
Step 5: Run the Installer
php artisan tallcms:install
This command will:
- Check prerequisites (HasRoles trait, panel provider, etc.)
- Publish and run migrations
- Set up roles and permissions
- Activate the TallDaisy theme (styled frontend out of the box)
- Create your admin user interactively
Theme Configuration
The installer automatically activates the TallDaisy theme, which provides daisyUI-powered styling for all frontend pages. If your frontend pages appear unstyled after installation:
- Verify
TALLCMS_THEMES_ENABLEDis not set tofalsein your.env - Check that
public/themes/talldaisy/exists (runphp artisan theme:list) - Re-run
php artisan tallcms:install --forceto re-activate the theme
You can customize the active theme in the admin panel under Appearance > Themes.
Selective Features
Disable components you don't need:
->plugin(
TallCmsPlugin::make()
->withoutPosts() // Disable blog posts
->withoutCategories() // Disable categories
->withoutContactSubmissions() // Disable contact form submissions
)
Standalone Installation
The standalone installation gives you a complete CMS with themes, plugins, web installer, and auto-updates.
# Create new project
composer create-project tallcms/tallcms my-site
# Navigate to project
cd my-site
# Install frontend dependencies and build assets
npm install && npm run build
# Start development server
php artisan serve
Visit http://localhost:8000/install to complete the web installer. After setup, your admin panel is at http://localhost:8000/admin.
Web Installer
The web installer guides you through:
- System Check — Verifies PHP version, extensions, and permissions
- Database Setup — Configure MySQL, MariaDB, or SQLite connection
- Admin Account — Create your administrator user
- Site Settings — Set site name, contact email, timezone
- Mail Configuration — SMTP, Amazon SES, or PHP Mail
- Cloud Storage (Optional) — S3-compatible storage setup
Manual Configuration (Alternative)
If you prefer command-line setup instead of the web installer:
# Copy environment file
cp .env.example .env
# Generate application key
php artisan key:generate
# Configure your .env file with database credentials
# Then run migrations
php artisan migrate --force
# Create storage symlink
php artisan storage:link
# Create admin user interactively
php artisan make:user
Post-Installation
After installation, access the admin panel at:
https://yourdomain.com/admin
Log in with the admin credentials you created during setup. From here you can:
- Create pages and posts in Content > Pages and Content > Posts
- Set up navigation menus in Content > Menus
- Configure site settings in Settings > Site Settings
- Customize your theme in Appearance > Themes
- Manage roles and permissions in Settings > Shield
Tip: The default admin path is
/admin. If you changed the panel path during setup, use that instead.
Frontend Routes (Plugin Mode)
Frontend routes are disabled by default in plugin mode to avoid conflicts with your existing routes.
Enable CMS Routes
Add to your .env file:
TALLCMS_ROUTES_ENABLED=true
This registers:
/- Homepage (if a page is marked as homepage)/{slug}- CMS pages by slug
Routes automatically exclude common paths: your panel path (default /admin), /api, /livewire, /storage, etc.
Homepage Conflict
When TALLCMS_ROUTES_ENABLED=true without a prefix, TallCMS registers the / route. Laravel loads your app's routes/web.php after package routes, so you must either:
Option A: Remove the default / route from routes/web.php:
// Remove or comment out:
// Route::get('/', function () {
// return view('welcome');
// });
Option B: Use a route prefix:
TALLCMS_ROUTES_PREFIX=cms
This changes routes to /cms (homepage) and /cms/{slug} (pages).
Configure Homepage
In the admin panel, edit a CMS page and check "Set as Homepage" to serve it at the root URL.
Publish Assets
For frontend styling, publish the TallCMS assets:
php artisan vendor:publish --tag=tallcms-assets
Alpine.js Requirement
TallCMS frontend pages require Alpine.js. Most Laravel apps include it via Livewire. If loading Alpine separately, ensure it loads before tallcms.js (components use alpine:init).
REST API (Plugin Mode)
TallCMS includes a full REST API for headless CMS usage. The API is disabled by default.
Enable the API
Add to your .env file:
TALLCMS_API_ENABLED=true
This registers all API endpoints at /api/v1/tallcms/*.
API Configuration
| Variable | Default | Description |
|---|---|---|
TALLCMS_API_ENABLED | false | Enable/disable the REST API |
TALLCMS_API_PREFIX | api/v1/tallcms | API route prefix |
TALLCMS_API_RATE_LIMIT | 60 | Requests per minute |
TALLCMS_API_AUTH_RATE_LIMIT | 5 | Max failed auth attempts before lockout |
TALLCMS_API_AUTH_LOCKOUT | 15 | Lockout duration in minutes |
TALLCMS_API_TOKEN_EXPIRY | 365 | Token expiry in days |
Webhooks Configuration
| Variable | Default | Description |
|---|---|---|
TALLCMS_WEBHOOKS_ENABLED | false | Enable webhook dispatching |
TALLCMS_WEBHOOK_TIMEOUT | 30 | HTTP timeout in seconds |
TALLCMS_WEBHOOK_MAX_RETRIES | 3 | Retry attempts on failure |
Generate API Documentation
Scribe generates interactive API documentation. It's a dev dependency — the /api/docs route only works when Scribe is installed.
composer require --dev knuckleswtf/scribe
php artisan vendor:publish --tag=tallcms-scribe-config
php artisan scribe:generate
The published config sets the docs URL to /api/docs and filters to TallCMS API routes only. Regenerate after modifying API endpoints.
Note: If you already use Scribe for other APIs, the publish command will overwrite your existing
config/scribe.php. Merge the TallCMS route prefix into your existing config'sroutesarray instead.
Production: The API endpoints work without Scribe, but /api/docs won't be available. Options:
- Import
storage/app/private/scribe/openapi.yamlinto Swagger UI or Postman - Deploy generated docs (
resources/views/scribe/) to a separate static host - Run a staging environment with Scribe installed for documentation
Next Steps
See REST API Development for authentication, endpoints, and usage details.
Cloud Storage Setup
TallCMS supports S3-compatible cloud storage for media uploads.
Supported Providers
- Amazon S3
- DigitalOcean Spaces
- Cloudflare R2
- Backblaze B2
- Wasabi
- MinIO (self-hosted)
- Any S3-compatible provider
Configuration
Add to your .env file:
# Storage credentials
AWS_ACCESS_KEY_ID=your-access-key
AWS_SECRET_ACCESS_KEY=your-secret-key
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=your-bucket-name
# Enable S3 storage
FILESYSTEM_DISK=s3
# For non-AWS providers, add endpoint:
AWS_ENDPOINT=https://nyc3.digitaloceanspaces.com
Provider Examples
DigitalOcean Spaces:
AWS_ACCESS_KEY_ID=your-spaces-key
AWS_SECRET_ACCESS_KEY=your-spaces-secret
AWS_DEFAULT_REGION=nyc3
AWS_BUCKET=my-space-name
AWS_ENDPOINT=https://nyc3.digitaloceanspaces.com
FILESYSTEM_DISK=s3
Cloudflare R2:
AWS_ACCESS_KEY_ID=your-r2-access-key
AWS_SECRET_ACCESS_KEY=your-r2-secret-key
AWS_DEFAULT_REGION=auto
AWS_BUCKET=my-bucket
AWS_ENDPOINT=https://YOUR_ACCOUNT_ID.r2.cloudflarestorage.com
FILESYSTEM_DISK=s3
MinIO (Self-Hosted):
AWS_ACCESS_KEY_ID=minioadmin
AWS_SECRET_ACCESS_KEY=minioadmin
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=my-bucket
AWS_ENDPOINT=http://localhost:9000
AWS_USE_PATH_STYLE_ENDPOINT=true
FILESYSTEM_DISK=s3
Bucket Configuration
Ensure your bucket:
- Allows public read access for uploaded files
- Has CORS configured for direct uploads (if needed)
Mail Configuration
SMTP
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailgun.org
MAIL_PORT=587
MAIL_USERNAME=your-username
MAIL_PASSWORD=your-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=noreply@yourdomain.com
MAIL_FROM_NAME="${APP_NAME}"
Amazon SES
MAIL_MAILER=ses
MAIL_FROM_ADDRESS=noreply@yourdomain.com
MAIL_FROM_NAME="${APP_NAME}"
# Uses same AWS credentials as S3
AWS_ACCESS_KEY_ID=your-access-key
AWS_SECRET_ACCESS_KEY=your-secret-key
AWS_DEFAULT_REGION=us-east-1
Note: Amazon SES starts in sandbox mode. You must verify your domain/email and request production access.
Web Server Configuration
Apache
Ensure mod_rewrite is enabled and the .htaccess file in public/ is being processed:
<VirtualHost *:80>
ServerName yourdomain.com
DocumentRoot /var/www/tallcms/public
<Directory /var/www/tallcms/public>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Nginx
server {
listen 80;
server_name yourdomain.com;
root /var/www/tallcms/public;
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
File Permissions
# Set ownership (adjust user/group as needed)
sudo chown -R www-data:www-data /var/www/tallcms
# Set directory permissions
sudo find /var/www/tallcms -type d -exec chmod 755 {} \;
# Set file permissions
sudo find /var/www/tallcms -type f -exec chmod 644 {} \;
# Make storage and cache writable
sudo chmod -R 775 /var/www/tallcms/storage
sudo chmod -R 775 /var/www/tallcms/bootstrap/cache
Upgrading
Standalone Mode
Use the built-in update system in Settings > System Updates, or via CLI:
# Check for updates (dry run)
php artisan tallcms:update --dry-run
# Update to latest version
php artisan tallcms:update
# Update to specific version
php artisan tallcms:update --target=3.2.0
Plugin Mode
Update via Composer:
composer update tallcms/cms
php artisan migrate
php artisan view:clear
Alternative Installation Methods
These methods are available for standalone installations but are not the recommended approach.
Manual Download
- Download the latest release from tallcms.com or GitHub Releases
- Extract the archive to your web server directory
- Set your web server's document root to the
public/directory - Run
composer install && npm install && npm run build - Visit your domain in a browser and follow the setup wizard
Git Clone (For Contributors)
# Clone the repository
git clone https://github.com/tallcms/tallcms.git
cd tallcms
# Install PHP dependencies
composer install
# Install frontend dependencies and build assets
npm install && npm run build
# Start development server with hot reload
composer dev
Visit http://localhost:8000/install to complete setup. After installation, the admin panel is at http://localhost:8000/admin.
Common Pitfalls
"Installation already complete"Delete storage/installer.lock from project root, or set INSTALLER_ENABLED=true in .env.
"Database connection failed"Verify database credentials in installer form. Ensure database server is running and the database exists.
"Permission denied" during installationEnsure storage/ and bootstrap/cache/ are writable. Run chmod -R 775 storage bootstrap/cache.
"Cannot access admin panel"The admin panel is at /admin (e.g., https://yourdomain.com/admin). Complete the web installer first if you haven't already. Verify your user has an active role. If you changed the panel path in AdminPanelProvider.php, use that path instead.
"403 Forbidden"Clear permission cache: php artisan permission:cache-reset. Verify user has appropriate role.
"CMS resources not appearing"Ensure TallCmsPlugin::make() is registered in your panel provider. Run php artisan migrate to create the CMS tables. Clear config cache: php artisan config:clear.
Next Steps
Comments
No comments yet. Be the first to share your thoughts!