- Overview
- Features
- System Requirements
- Installation Guide
- Configuration
- Directory Structure
- User Guide
- Admin Panel Guide
- Content Management
- User Management
- Comments System
- Media Gallery
- Backup System
- Search Functionality
- Analytics Dashboard
- Sitemap Generator
- Settings & Configuration
- API Documentation
- Security Features
- Multilingual Support
- Troubleshooting
- Contributing
- License
A powerful, enterprise-grade Content Management System built with CodeIgniter 4. This CMS provides a complete solution for managing websites, blogs, and online content with a modern admin interface, comprehensive features, and robust security.
-
🚀 Built on CodeIgniter 4 - Fast, secure, and lightweight framework
-
🎨 Modern Admin Interface - Responsive, intuitive, and user-friendly
-
🔐 Role-Based Access Control - Admin, Editor, Author, Subscriber roles
-
📱 Mobile-First Design - Works perfectly on all devices
-
🌐 SEO Optimized - Built-in SEO tools and sitemap generator
-
🔒 Enterprise Security - CSRF, XSS protection, SQL injection prevention
-
📊 Advanced Analytics - Real-time statistics and insights
-
💾 Automated Backups - Database and file backup with cloud storage
-
🔍 Powerful Search - Full-text search with indexing
-
🖼️ Media Gallery - Drag-and-drop image management with Quill.js integration
-
🌎 Multilingual - Built-in support for English and Portuguese (Brazil)
| Feature | Description |
|---|---|
| User Management | Complete user authentication with registration, login, password reset |
| Role-Based Access | Admin, Editor, Author, Subscriber with granular permissions |
| Post Management | Create, edit, delete, and publish posts with Quill.js rich editor |
| Category System | Hierarchical categories with unlimited nesting |
| Comments System | Threaded comments with moderation and spam protection |
| Media Gallery | Drag-and-drop image upload with gallery picker for posts |
| Search Engine | Full-text search with auto-complete and advanced filters |
| Backup Manager | Automated database and file backups with cloud storage |
| Analytics Dashboard | Real-time statistics with interactive charts |
| Sitemap Generator | XML sitemaps with auto-ping to search engines |
| SEO Tools | Meta tags, friendly URLs, robots.txt management |
| Settings Manager | Centralized configuration for all site settings |
| Multilingual | Built-in English and Portuguese (Brazil) support |
-
📊 Real-time Analytics - Traffic sources, device breakdown, user engagement
-
🔄 Automated Backups - Schedule backups with retention policies
-
☁️ Cloud Storage - FTP, SFTP, S3, Dropbox, Google Drive support
-
📱 Responsive Design - Works on desktop, tablet, and mobile
-
🔍 Advanced Search - Filter by date, category, author, and more
-
🖼️ Image Gallery - Bulk upload, delete, and image information with Quill.js integration
-
📧 Email System - SMTP support with test functionality
-
🔐 Security Features - Login throttling, session management, HTTPS enforcement
-
🌎 Multilingual - Language switcher with session persistence
-
🗺️ Sitemap Generator - Automatic XML sitemaps with image and news support
| Requirement | Minimum | Recommended |
|---|---|---|
| PHP Version | 7.4 | 8.0 or higher |
| Database | MySQL 5.7 | MySQL 8.0 / MariaDB 10.4 |
| Web Server | Apache 2.4 | Nginx 1.18 |
| Memory Limit | 128M | 256M |
| Max Execution Time | 180 seconds | 300 seconds |
| Upload Max Size | 32M | 64M |
| Post Max Size | 32M | 64M |
-
mysqli- Database connection -
curl- API calls and remote connections -
json- JSON handling -
mbstring- Multi-byte string support -
intl- Internationalization -
gd- Image processing -
zip- File compression for backups -
xml- XML sitemap generation
-
JavaScript enabled
-
Cookies enabled
-
Minimum screen resolution: 320px (mobile) to 1920px (desktop)
# Clone the repository
git clone https://github.com/andrexm/zerd-cms.git
# Navigate to project directory
cd zerd-cms# Install PHP dependencies via Composer
composer install# Copy environment file
cp env .env
# Edit .env file with your configuration
nano .envCREATE DATABASE zerd_cms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;# Run all database migrations
php spark migrate
# Seed default data (admin user and settings)
php spark db:seed DatabaseSeeder# Set writable directory permissions
chmod -R 755 writable/
chmod -R 755 public/uploads/
# Create required directories
mkdir -p public/uploads/posts
mkdir -p public/uploads/avatars
mkdir -p public/uploads/gallery
mkdir -p public/uploads/settings
mkdir -p writable/backups
mkdir -p writable/cache
mkdir -p writable/logs
mkdir -p writable/session<VirtualHost *:80>
ServerName yourdomain.com
DocumentRoot /var/www/zerd_cms/public
<Directory /var/www/zerd-cms/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>server {
listen 80;
server_name yourdomain.com;
root /var/www/zerd-cms/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}# Generate a random 32-character key
openssl rand -base64 32
# Add to .env file
encryption.key = hex2bin:your-generated-key# Clear cache
php spark cache:clear
# Test installation
php spark serve-
Frontend:
http://localhost:8080 -
Admin Panel:
http://localhost:8080/admin -
Default Admin Login:
-
Email:
[email protected] -
Password:
admin123
-
#--------------------------------------------------------------------
# ENVIRONMENT
#--------------------------------------------------------------------
CI_ENVIRONMENT = development
#--------------------------------------------------------------------
# APP
#--------------------------------------------------------------------
app.baseURL = 'http://localhost:8080/'
app.forceGlobalSecureRequests = false
#--------------------------------------------------------------------
# DATABASE
#--------------------------------------------------------------------
database.default.hostname = localhost
database.default.database = zerd_cms
database.default.username = root
database.default.password =
database.default.DBDriver = MySQLi
database.default.DBPrefix =
database.default.port = 3306
#--------------------------------------------------------------------
# ENCRYPTION
#--------------------------------------------------------------------
encryption.key = hex2bin:your-32-character-hex-key
#--------------------------------------------------------------------
# EMAIL
#--------------------------------------------------------------------
email.protocol = smtp
email.SMTPHost = smtp.gmail.com
email.SMTPUser = [email protected]
email.SMTPPass = your-app-password
email.SMTPPort = 587
email.SMTPCrypto = tls
#--------------------------------------------------------------------
# BACKUP
#--------------------------------------------------------------------
backup.path = writable/backups/
backup.retention_days = 30
backup.auto_cleanup = true
#--------------------------------------------------------------------
# GALLERY
#--------------------------------------------------------------------
gallery.max_file_size = 5242880 # 5MB
gallery.allowed_types = jpg,jpeg,png,gif,webp
gallery.thumbnail_size = 300x300app/Config/Database.php
public $default = [
'DSN' => '',
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'zerd_cms',
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306,
];app/Config/Email.php
public $fromEmail = '[email protected]';
public $fromName = 'Your CMS';
public $protocol = 'smtp';
public $SMTPHost = 'smtp.gmail.com';
public $SMTPUser = '[email protected]';
public $SMTPPass = 'your-password';
public $SMTPPort = 587;
public $SMTPCrypto = 'tls';
public $mailType = 'html';
public $charset = 'utf-8';
public $newline = "\r\n";zerd_cms/
├── app/
│ ├── Config/ # Configuration files
│ │ ├── Database.php # Database configuration
│ │ ├── Routes.php # Route definitions
│ │ ├── Filters.php # Filter configuration
│ │ └── Email.php # Email settings
│ ├── Controllers/ # Controllers
│ │ ├── Admin/ # Admin controllers
│ │ │ ├── Dashboard.php
│ │ │ ├── Posts.php
│ │ │ ├── Categories.php
│ │ │ ├── Comments.php
│ │ │ ├── Users.php
│ │ │ ├── Gallery.php
│ │ │ ├── Backup.php
│ │ │ ├── BackupSchedule.php
│ │ │ ├── BackupRemote.php
│ │ │ ├── Search.php
│ │ │ ├── Analytics.php
│ │ │ ├── Sitemap.php
│ │ │ └── Settings.php
│ │ ├── Api/ # API controllers
│ │ ├── Auth.php # Authentication
│ │ ├── Language.php # Language switcher
│ │ └── Sitemap.php # Public sitemap
│ ├── Models/ # Models
│ │ ├── UserModel.php
│ │ ├── PostModel.php
│ │ ├── CategoryModel.php
│ │ ├── CommentModel.php
│ │ ├── VisitModel.php
│ │ ├── BackupModel.php
│ │ └── SettingModel.php
│ ├── Views/ # Views
│ │ ├── admin/ # Admin views
│ │ │ ├── layouts/
│ │ │ ├── dashboard/
│ │ │ ├── posts/
│ │ │ ├── categories/
│ │ │ ├── comments/
│ │ │ ├── users/
│ │ │ ├── gallery/
│ │ │ ├── backup/
│ │ │ ├── analytics/
│ │ │ ├── sitemap/
│ │ │ └── settings/
│ │ ├── auth/ # Authentication views
│ │ ├── frontend/ # Frontend views
│ │ ├── sitemap/ # Sitemap XML views
│ │ └── emails/ # Email templates
│ ├── Entities/ # Entity classes
│ ├── Filters/ # Filters
│ │ ├── AuthFilter.php
│ │ ├── RoleFilter.php
│ │ ├── LanguageFilter.php
│ │ └── NoToolbarFilter.php
│ ├── Helpers/ # Helper functions
│ │ ├── language_helper.php
│ │ ├── settings_helper.php
│ │ ├── image_helper.php
│ │ └── visits_helper.php
│ ├── Services/ # Services
│ │ └── BackupService.php
│ └── Database/
│ ├── Migrations/ # Database migrations
│ └── Seeds/ # Seeders
├── public/
│ ├── assets/
│ │ ├── css/ # CSS files
│ │ ├── js/ # JavaScript files
│ │ └── images/ # Images
│ └── uploads/ # Uploaded files
│ ├── posts/ # Post images
│ ├── avatars/ # User avatars
│ ├── gallery/ # Gallery images
│ └── settings/ # Site settings images
├── writable/
│ ├── cache/ # Cache files
│ ├── logs/ # Log files
│ ├── backups/ # Backup files
│ └── sessions/ # Session files
├── vendor/ # Composer dependencies
├── .env # Environment configuration
├── .htaccess # Apache configuration
├── spark # CLI tool
└── README.md # This file
-
Homepage: View latest published posts with excerpts
-
Categories: Browse posts by category with filtering
-
Search: Full-text search with auto-complete and advanced filters
-
Single Post: Read full articles with author info, comments, and related posts
-
Contact Form: Send messages to site administrators
| Feature | Description |
|---|---|
| Registration | Create new account with email verification |
| Login | Secure authentication with remember me |
| Profile Management | Update personal info, upload avatar |
| Password Reset | Forgot password functionality with email |
| Comments | Participate in discussions (registered users) |
| Guest Comments | Optional commenting for non-registered users |
| URL | Description |
|---|---|
/ |
Homepage |
/post/{slug} |
Single post view |
/category/{slug} |
Category posts listing |
/page/{slug} |
Static pages (about, privacy, terms) |
/contact |
Contact form |
/search |
Search page with filters |
/search/advanced |
Advanced search form |
/login |
Login page |
/register |
Registration page |
/forgot-password |
Password reset request |
/reset-password/{token} |
Password reset form |
/language/switch/{locale} |
Language switcher |
The admin dashboard provides real-time statistics and quick access to all features:
-
Statistics Cards: Total posts, views, users, comments, visits
-
Quick Actions: Create post, manage gallery, view comments
-
Recent Activity: Live feed of posts, comments, and user registrations
-
System Info: PHP version, database status, cache status, disk usage
-
Visit Stats: Today's visits, unique visitors, currently online
-
URL:
/admin -
Default Credentials:
-
Email:
[email protected] -
Password:
admin123
-
Dashboard
├── Content
│ ├── Posts
│ │ ├── All Posts
│ │ └── Create New
│ ├── Categories
│ └── Comments
├── Media
│ └── Gallery
├── Users
│ ├── All Users
│ └── Create New
├── Analytics
├── System
│ ├── Backup Manager
│ │ ├── Schedules
│ │ └── Remote Storage
│ ├── Search Index
│ └── Sitemap
├── Settings
└── Language Switcher
| URL | Description |
|---|---|
/admin |
Dashboard |
/admin/dashboard |
Dashboard (alias) |
/admin/posts |
Manage posts |
/admin/posts/create |
Create new post |
/admin/posts/edit/{id} |
Edit post |
/admin/posts/delete/{id} |
Delete post |
/admin/categories |
Manage categories |
/admin/comments |
Manage comments |
/admin/gallery |
Image gallery |
/admin/users |
Manage users |
/admin/users/create |
Create new user |
/admin/users/edit/{id} |
Edit user |
/admin/analytics |
Analytics dashboard |
/admin/backup |
Backup manager |
/admin/backup/schedules |
Backup schedules |
/admin/backup/remote |
Remote storage config |
/admin/search/index |
Search index management |
/admin/sitemap |
Sitemap generator |
/admin/settings |
Site settings |
/admin/profile |
User profile |
/admin/profile/edit |
Edit profile |
/admin/profile/change-password |
Change password |
-
Navigate to Admin → Posts → Create New
-
Fill in the following fields:
| Field | Description | Required |
|---|---|---|
| Title | Post title | Yes |
| Slug | URL-friendly version (auto-generated) | No |
| Content | Main post content with Quill.js rich editor | Yes |
| Excerpt | Brief summary (auto-generated from content) | No |
| Category | Select from existing categories | No |
| Status | Draft, Published, or Archived | Yes |
| Featured Image | Select from gallery or upload new | No |
| Meta Title | SEO title (defaults to post title) | No |
| Meta Description | SEO description (defaults to excerpt) | No |
| Meta Keywords | SEO keywords (comma separated) | No |
-
Rich Text Formatting - Bold, italic, underline, strikethrough
-
Headings - H1 to H6
-
Lists - Ordered and unordered
-
Blockquotes - For citations
-
Code Blocks - For code snippets
-
Links - Insert hyperlinks
-
Images - Insert images from gallery
-
Video - Embed videos
-
Formulas - Mathematical expressions
-
Clean Formatting - Remove all formatting
-
Click the gallery button in the Quill toolbar
-
Browse images by tabs (All, Gallery, Posts)
-
Select one or multiple images
-
Choose image size and alignment
-
Click "Insert Selected" - images appear at cursor position
| Status | Description |
|---|---|
| Draft | Not visible to public, only in admin |
| Published | Visible on website, included in feeds |
| Archived | Hidden from main lists but still accessible via direct URL |
-
Top Level: Independent categories
-
Subcategories: Nested under parent categories
-
Unlimited nesting: Create complex category structures
| Operation | Description |
|---|---|
| Create | Add new category with name, slug, description |
| Edit | Modify category details |
| Delete | Remove category (checks for posts) |
| Info | View category statistics and post count |
| Status | Description |
|---|---|
| Pending | Awaiting moderation |
| Approved | Visible on site |
| Spam | Marked as spam (hidden) |
| Trash | Deleted comments |
-
Approve: Make comment visible on site
-
Spam: Mark as spam (moves to spam folder)
-
Delete: Remove permanently
-
Bulk Actions: Process multiple comments at once
-
View Details: See full comment with thread
| Role | Permissions |
|---|---|
| Admin | Full system access, all features |
| Editor | Manage all content, moderate comments |
| Author | Create and edit own posts |
| Subscriber | Comment on posts, manage profile |
-
Go to Admin → Users → Create New
-
Fill in required fields:
-
Username (unique)
-
Email (unique)
-
Password (min 6 characters)
-
Role (Admin, Editor, Author, Subscriber)
-
Status (Active/Inactive)
-
-
Optional fields:
-
First Name
-
Last Name
-
Bio
-
Avatar (image upload)
-
-
Total posts created
-
Published posts count
-
Total comments
-
Total views across all posts
-
Registration date
-
Last login time
-
✅ Multiple Directories - Organize images in different folders
-
✅ Drag & Drop Upload - Easy file upload with progress bar
-
✅ Bulk Operations - Select and delete multiple images
-
✅ Image Preview - Thumbnail grid with hover effects
-
✅ Image Information - Size, dimensions, type, modification date
-
✅ Copy Functions - Copy image URL or HTML code
-
✅ File Validation - Type and size checking
-
✅ Quill.js Integration - Insert images directly into posts
-
✅ Featured Image Selection - Select from gallery for post featured images
uploads/
├── posts/ # Post featured images
├── avatars/ # User profile pictures
├── gallery/ # General gallery images
└── settings/ # Site logo and favicon
| Setting | Value |
|---|---|
| Max File Size | 5MB (configurable) |
| Allowed Types | jpg, jpeg, png, gif, webp |
| Max Width | 2048px (optional) |
| Max Height | 2048px (optional) |
-
Upload: Drag and drop or click to select
-
Select: Click images to select (multiple selection)
-
Insert: Insert selected images into Quill editor
-
Delete: Single or bulk delete with confirmation
| Type | Description | Contents |
|---|---|---|
| Database | Complete database dump | All tables with structure and data |
| Files | Application files and uploads | Config, Controllers, Models, Views, Uploads |
| Full | Combined database and files | Everything in one archive |
-
✅ Manual Backups - Create on-demand backups
-
✅ Scheduled Backups - Automated backups (hourly, daily, weekly, monthly)
-
✅ Retention Policy - Automatically delete old backups
-
✅ Compression - gzip compression for smaller files
-
✅ Download - Download backups to local machine
-
✅ Restore - Restore from any backup
-
✅ Cloud Storage - Upload to remote locations
| Provider | Type | Authentication |
|---|---|---|
| FTP | Remote | Host, Port, Username, Password |
| SFTP | Secure Remote | Host, Port, Username, Password |
| S3 | Cloud | Access Key, Secret Key, Bucket, Region |
| Dropbox | Cloud | Access Token |
| Google Drive | Cloud | Client ID, Client Secret, Refresh Token |
-
✅ Dedicated Visits Table - Separate table for detailed analytics
-
✅ Real-time Stats - Currently online, visits today, last hour
-
✅ Device Detection - Desktop, mobile, tablet, bot
-
✅ Browser Tracking - Most popular browsers
-
✅ OS Tracking - Operating systems
-
✅ Unique Visitors - Count by IP address
-
✅ Bounce Rate - Single page visits
-
✅ Hourly Breakdown - Visits by hour
-
✅ Daily Trends - Visits over time
-
✅ Top Pages - Most visited posts
-
✅ Referrer Tracking - Where visitors come from
| Method | Description |
|---|---|
recordVisit() |
Record a new visit with device, browser, OS |
getTodayVisits() |
Get total visits for today |
getTodayUniqueVisitors() |
Get unique visitors for today |
getVisitsByHourToday() |
Get hourly breakdown for today |
getVisitsByDay() |
Get daily breakdown for last X days |
getVisitsByDevice() |
Get device type distribution |
getTopPages() |
Get most visited posts |
getRealtimeStats() |
Get real-time statistics |
-
✅ Multiple Sitemaps - Posts, categories, pages, authors, images, news
-
✅ Automatic Pagination - Split large sitemaps (500 URLs per file)
-
✅ Priority Calculation - Based on content freshness
-
✅ Change Frequency - Daily, weekly, monthly, yearly
-
✅ Last Modified - Automatic lastmod timestamps
-
✅ Image Sitemap - Google Image search support
-
✅ News Sitemap - Google News support
-
✅ Ping Search Engines - Notify Google, Bing
-
✅ Admin Management - Generate, view, delete sitemaps
| Type | URL | Description |
|---|---|---|
| Index | /sitemap.xml |
Main sitemap index |
| Posts | /sitemap/posts/{page}.xml |
All published posts (paginated) |
| Categories | /sitemap/categories.xml |
All categories |
| Authors | /sitemap/authors.xml |
Active authors |
| Pages | /sitemap/pages.xml |
Static pages |
| Images | /sitemap/images.xml |
Image sitemap for Google Images |
| News | /sitemap/news.xml |
News sitemap for Google News |
# Via admin panel
Admin → Sitemap → Generate
# Via CLI
php spark sitemap:generate| Setting | Description |
|---|---|
| Site Title | Website name |
| Site Description | Meta description for SEO |
| Site Keywords | Meta keywords |
| Site Email | Main contact email |
| Site Logo | Upload logo image |
| Favicon | Browser tab icon |
| Site Language | Default language |
| Timezone | Site timezone |
| Setting | Description |
|---|---|
| Posts Per Page | Number of posts in listings |
| Excerpt Length | Characters in excerpts |
| Enable Comments | Global comment toggle |
| Auto-approve Comments | Auto-approve registered users |
| Comments Per Page | Comments in thread |
| Allow Nesting | Enable threaded comments |
| Max Nesting Level | Depth of replies |
| Setting | Description |
|---|---|
| Enable Pretty URLs | Clean URLs structure |
| Enable Sitemap | Automatic sitemap generation |
| Auto-ping Search Engines | Notify on update |
| Google Analytics ID | Tracking code |
| Google Site Verification | Search Console verification |
| Bing Site Verification | Bing Webmaster Tools |
| Robots.txt | Custom robots.txt content |
-
✅ Built-in Languages - English (en) and Portuguese (pt_BR)
-
✅ Language Switcher - Dropdown in admin panel
-
✅ Session Persistence - Language preference stored in session
-
✅ Translation Files - Separate files for Common, Auth, Admin
-
✅ Helper Function -
_l('file.key')for translations -
✅ Fallback Mechanism - Falls back to English if translation missing
-
✅ Extensible - Easy to add more languages
-
Create new directory:
app/Language/es/ -
Copy English files and translate them
-
Add to
get_languages()helper function:
function get_languages()
{
return [
'en' => 'English',
'pt_BR' => 'Português (Brasil)',
'es' => 'Español',
];
}<!-- Using _l() helper -->
<h1><?= _l('Admin.dashboard') ?></h1>
<p><?= _l('Common.welcome_back') ?>, <?= session()->get('user_name') ?>!</p>
<!-- With parameters -->
<p><?= _l('Common.showing') ?> {start} {to} {of} {total} {entries}</p>-
Password Hashing: Bcrypt algorithm
-
Session Management: Database sessions
-
Remember Me: Secure token-based
-
Login Throttling: Prevent brute force
-
Role-Based Access: Admin, Editor, Author, Subscriber
-
Route Protection: Auth filters
-
API Authentication: Token-based (optional)
-
CSRF Protection: All forms
-
XSS Prevention: Output escaping
-
SQL Injection: Prepared statements
-
Input Validation: Strict validation rules
-
Upload Validation: Type, size checks
-
Path Traversal: Prevention
-
File Permissions: Proper chmod
Error: Unable to connect to the database
Solution:
# Check database credentials in .env
# Verify MySQL is running
sudo systemctl status mysql
# Test connection
php spark db:connectError: 404 - File Not Found
Solution:
# Check .htaccess file exists
# Verify mod_rewrite is enabled
sudo a2enmod rewrite
sudo systemctl restart apache2
# Check base URL in .env
app.baseURL = 'http://yourdomain.com/'Error: File upload failed
Solution:
# Check directory permissions
chmod -R 755 public/uploads/
# Check PHP upload limits in php.ini
upload_max_filesize = 64M
post_max_size = 64MError: XML declaration allowed only at the start of the document
Solution:
# Disable debug toolbar for XML routes
# Or run BOM checker
php spark sitemap:cleanError: Language selector doesn't change language
Solution:
# Check session is working
# Verify language files exist in correct directory
# Clear cache
rm -rf writable/cache/*# Fork repository
git clone https://github.com/andrexm/zerd-cms.git
cd zerd_cms
# Install dependencies
composer install
# Create feature branch
git checkout -b feature/your-feature-
PHP: Follow PSR-12 coding style
-
JavaScript: Use ES6+ features
-
CSS: Use BEM naming convention
-
Documentation: PHPDoc for all methods
-
Update documentation
-
Add tests if applicable
-
Ensure all tests pass
-
Request review
The MIT License (MIT). Please see License File for more information.
-
CodeIgniter 4 - PHP Framework
-
Bootstrap 5 - CSS Framework
-
Font Awesome - Icons
-
Quill.js - Rich Text Editor
-
jQuery - JavaScript Library
-
Chart.js - Charts
-
CodeIgniter Team
-
Open Source Community
Thank you for using our CodeIgniter 4 CMS! 🚀