Modular PHP CMS built for developers.
Vertext is a lightweight, extensible content management system written in PHP 8.2+. It provides a professional admin panel, role-based access control, and a clean module system so you can ship exactly the features you need - nothing more.
Vertext 0.1.4b is a public self-host beta - good enough for real use, but not enterprise-hardened. Read Known Limitations before deploying, and Going to Production before inviting real users.
Built on Phuse 1.3.0 - Vertext is powered by the Phuse framework, which provides the ORM, router, session manager, input helpers, validator, and core utilities.
- Modular architecture - install, enable, disable, and uninstall modules without touching core code; modules declare inter-dependencies enforced at install/uninstall time
- Role-based access control - fine-grained permissions per resource and action; custom roles
- Admin panel - responsive sidebar UI with dark/light theme, flash messages, and audit trail
- Public theme system -
ThemeEnginewraps all front-end module views in a shared theme layout; 4 bundled themes (Default, Clean, Field, Frame) support dark/light mode with OS preference detection and a toggle button - Email notifications - built-in Mailer (PHP mail + SMTP); contact notifications, comment approvals, auto-replies, welcome emails
- Slug auto-generation -
vtx-slugcomponent generates URL slugs from titles across all module forms - Navigation module - build front-end menus with custom links, page slugs, module routes, and dropdown support; modules auto-register nav items on install; renders automatically in theme layouts via
NavHelper - Admin profile page - any logged-in user can update their own name, email, and password at
/admin/profile - Blog module - posts, categories, tags, comment moderation, Quill editor, SEO fields, dynamic URL routing, RSS feed, scheduled/expired publishing, content revisions
- Analytics module - privacy-friendly page-view tracking; unique visitors; device breakdown; date range filter; period comparison; CSV export
- Search module - full-text ILIKE search across indexed pages and posts;
GET /search; admin reindex dashboard - Theme Customizer module - accent color, font family, logo, and freeform custom CSS overrides injected into all theme layouts
- Media module - file upload with image resizing + thumbnail generation; grid browser; bulk delete; reusable picker modal
- Pages module - static page CRUD with front-end rendering via ThemeEngine; scheduled/expired publishing; content revisions
- Sitemap module - automatic
/sitemap.xmlfrom published pages and blog posts; extensible viaSitemapProviderinterface - Webhooks module - outgoing webhooks with HMAC-SHA256 signed payloads; admin UI for endpoint management and delivery logs
- Gallery module - photo albums backed by Media library; drag-to-reorder; CSS lightbox
- Contact Form module - public contact form, admin inbox, email notifications, auto-reply
- Videos module - YouTube/Vimeo embed management; poster thumbnail caching; lazy iframe player
- Theme Manager - dedicated admin section (
/admin/themes) to switch the active front-end theme; promoted from a settings tab to a first-class system module - Setup wizard - guided 5-step installation with DB connection testing
- Security - CSRF protection, Argon2id passwords (auto-upgrade from bcrypt), password reset, active-session management, session hardening, login rate limiting, audit logs
- PostgreSQL - full native support via PDO with connection pooling and query caching
- vtx- component library* - chart, datatable, rich-text editor, media picker, tag input, upload, slug, and more
- Two-factor authentication (2FA) - TOTP (RFC 6238) via the TwoFactor module; QR code setup; backup codes; trusted-device cookie (30 days)
- Forms Builder module - drag-to-reorder field builder; conditional logic; multi-step forms; file uploads; email notifications; math challenge + optional reCAPTCHA v3;
[form]shortcode; CSV export - Newsletter module - subscribers with double opt-in; audience segments; scheduled campaigns; open/click tracking; welcome email;
[newsletter_signup]shortcode; CSV import/export - Events module - event listings with per-attendee RSVP, capacity + waiting list, ticket types, recurring events, iCal export, Canvas calendar sidebar, and attendee admin with CSV export
- Bundle packages - install groups of related modules in one click; custom bundle builder in the Module Manager
- Module Marketplace - install a module from any HTTPS URL via the Module Manager; SSRF-safe, SHA-256 verified
- Module scaffold CLI -
php vertext make:module Fooandphp vertext make:bundle Foogenerate boilerplate files - i18n -
__()translation helper; locale path-prefix routing (/id/...); per-content Language field; admin Translations editor with locale scaffolding;I18n::date()withIntlDateFormattersupport - Members module - front-end visitor accounts with email verification, member profiles, and admin moderation
- REST API - read-only JSON API (
/api/v1/posts,/pages,/events) with Bearer API keys and rate limiting - Performance - opt-in full-page cache for public renders, nav fragment cache, version-fingerprinted assets, lazy-loaded images
| Requirement | Version |
|---|---|
| PHP | 8.2 or higher |
| PostgreSQL | 13 or higher |
| PHP extensions | PDO, pdo_pgsql, json, mbstring, fileinfo |
| Web server | Apache (mod_rewrite) or Nginx |
# 1. Clone the repository
git clone https://github.com/primaybr/vertext.git
cd vertext
# 2. Point your web server document root to: /path/to/vertext/Public/
# 3. Open the setup wizard in your browser
# http://your-domain/setup
# Follow the 5 steps to configure the database and create an admin user.
# 4. Log in
# http://your-domain/admin/loginvertext/
├── App/ # Application code (your work lives here)
│ ├── CMS/ # Auth, Installer, ModuleManager, NavHelper, I18n
│ ├── Controllers/ # Admin, Setup, Web controllers
│ ├── Lang/ # Translation files (App/Lang/{locale}/{file}.php)
│ ├── Mail/ # Mailer, MailMessage, MailTemplate + Templates/
│ ├── Models/ # Database models
│ ├── Modules/ # Installable modules (Blog, Media, Pages, ...)
│ ├── Theme/ # ThemeEngine - wraps front-end views in a theme layout
│ ├── Themes/ # Theme source files (default/, clean/, field/, frame/)
│ └── Views/ # Templates (admin + deployed module views)
├── Core/ # Framework internals - do not modify
├── Config/ # Routes, Database, Paths config
├── Public/ # Web root - only this is web-accessible
│ ├── assets/ # CSS, JS, images (styles.css = Phuse framework base)
│ ├── themes/ # Deployed theme assets (auto-generated)
│ └── index.php # Front controller
├── Storage/ # Runtime config (gitignored: db.php, app.php)
├── Migrations/ # Database schema files
├── Cache/ # Query and template cache
└── Logs/ # Application logs
Vertext modules are self-contained units that own their database tables, routes, permissions, and views.
App/Modules/YourModule/
├── Module.php # Implements ModuleInterface (install, uninstall, registerRoutes)
├── module.json # Manifest: name, slug, version, category, nav links, permissions
├── Controllers/
├── Views/
└── Assets/ # Per-module CSS/JS, deployed to Public/assets/modules/{slug}/
Install a module: Admin → Module Manager → Install
| Module | Version | Category | Description |
|---|---|---|---|
| Blog | 0.0.6 | Content | Posts, categories, tags, threaded comments, post series with prev/next nav, related posts, reading list (localStorage), dynamic URL routing, RSS feed, scheduled/expired publishing, content revisions |
| Pages | 0.0.3 | Content | Static page CRUD, page templates (default/full-width/sidebar/landing), custom fields, scheduled/expired publishing, content revisions |
| Media | 0.0.4 | Media | File uploads, folders, browser image editor (crop/rotate/flip), thumbnails, bulk move/delete |
| Gallery | 0.0.1 | Media | Photo albums with lightbox, backed by Media library |
| Videos | 0.0.1 | Media | YouTube/Vimeo embed management with poster thumbnails |
| Contact | 0.0.1 | Communication | Public contact form with admin inbox and email notifications |
| Navigation | 0.0.2 | Navigation | Front-end menu builder; Module Route type; auto-registration of module nav routes on install |
| Analytics | 0.0.4 | Analytics | Privacy-friendly page-view tracking; unique visitors; device breakdown; date range filter; search term tracking; CSV + JSON export |
| Search | 0.0.1 | Content | Full-text search across pages and posts; GET /search; admin reindex button |
| Theme Customizer | 0.0.1 | Design | Accent color, font, logo, and custom CSS overrides for the public theme |
| Sitemap | 0.0.1 | SEO | Automatic /sitemap.xml from published pages and blog posts |
| Webhooks | 0.0.1 | Integration | Outgoing webhooks with HMAC-SHA256 signing and delivery logs |
| Forms | 0.0.2 | Communication | Form builder with conditional logic, multi-step pages, file uploads, email notifications, anti-spam (honeypot/math/reCAPTCHA v3), shortcode embed, CSV export |
| Newsletter | 0.0.2 | Communication | Subscribers, segments, scheduled campaigns, open/click tracking, welcome email, signup shortcode, CSV import/export |
| Events | 0.0.2 | Community | Per-attendee RSVP with capacity + waiting list, ticket types, recurring events, iCal export, attendee admin |
| Members | 0.0.1 | Community | Front-end visitor accounts: registration, email verification, profiles, admin moderation |
| Two-Factor Auth | 0.0.1 | Security | TOTP authenticator app support; backup codes; trusted-device cookie |
See docs/module-system.md and docs/creating-a-module.md for the full guide.
| Document | Description |
|---|---|
| Getting Started | Installation, requirements, first steps |
| Going to Production | Pre-launch checklist: env, permissions, HTTPS, backups |
| Upgrading | Git-pull upgrade steps, running migrations, version notes |
| Backup & Restore | vertext backup/restore, secret redaction, limitations |
| Troubleshooting | Install issues, DB connection problems, blank pages |
| Known Limitations | What this beta explicitly does not cover yet |
| Configuration | Config files, settings, mail keys, trusted proxies |
| Admin Guide | Users, roles, permissions, settings, modules, themes |
| Security | CSRF, RBAC, sessions, audit logs, uploads |
| Module System | How modules work, lifecycle, ModuleLoader |
| Creating a Module | Step-by-step module scaffold guide |
| ORM Guide | Query builder, CRUD, pagination, raw queries |
| Template System | {{var}}, {!! raw !!}, adminRender, flash |
| Theme System | ThemeEngine, dark/light mode, custom themes, asset deployment |
| Mail System | Mailer, MailMessage, templates, SMTP config |
| JS Components | vtx-chart, vtx-editor, vtx-slug, vtx-media-picker, etc. |
| Blog Module | Posts, categories, tags, comments, RSS feed |
| Media Module | Upload, image resizing, thumbnails, bulk delete, picker modal |
| Analytics Module | Page-view tracking, date range filter, period comparison, CSV export |
| Sitemap Module | Auto XML sitemap, SitemapProvider interface |
| Webhooks Module | Outgoing webhooks, HMAC signing, delivery logs |
| Pages Module | Static page CRUD and public rendering |
| Gallery Module | Photo albums, lightbox, drag-to-reorder |
| Contact Module | Public form, admin inbox, email notifications |
| Videos Module | YouTube/Vimeo embeds, poster thumbnails |
| CLI | Module scaffold and bundle creation commands |
| 2FA Module | TOTP setup, backup codes, trusted devices |
| Forms Module | Form builder, submissions, honeypot, CSV export |
| Newsletter Module | Subscriber management, double opt-in, HTML campaigns |
| Events Module | Event listings, RSVP, Canvas calendar |
| i18n Guide | Translation files, __() helper, locale routing, Translations admin |
| Members Module | Front-end accounts, email verification, SiteAuth |
| REST API | Endpoints, API keys, rate limits, response envelope |
| Caching | Full-page cache, fragment cache, asset fingerprinting |
| File | Description |
|---|---|
| examples/hello-module.php | Minimal module scaffold with module.json and Module.php |
| examples/using-auth.php | Auth::check, Auth::can, requirePermission |
| examples/custom-settings.php | Reading/writing site settings |
| examples/orm-queries.php | Common ORM query patterns |
| examples/media-picker-integration.php | Adding a media picker to a module form |
| examples/sending-mail.php | Sending email with Mailer and MailTemplate |
| examples/using-themes.php | ThemeEngine, dark/light mode, custom theme layout |
| examples/dispatching-webhooks.php | Dispatching webhook events from a module controller |
| examples/sitemap-provider.php | Implementing SitemapProvider to contribute URLs to /sitemap.xml |
Found a security issue? Please report it privately before disclosing publicly.
See docs/security.md for a full description of Vertext's security model.
MIT License - see LICENSE file for details.