# Technology Stack > Generated: 2026-04-26 ## PHP Runtime - **Required**: PHP 7.4+ (nikic/php-parser constraint), PHP 7.1+ / 8.0+ (deep-copy) - **Composer**: `composer.json` at project root - **Dev dependency**: `phpunit/phpunit: ^10.5` - **No runtime Composer packages** — all libraries are vendored manually in `libraries/` ## Database | Item | Value | |------|-------| | Engine | MySQL | | Config | `config.php` (plain-text credentials) | | Abstraction | Medoo 1.7.3 (`libraries/medoo/medoo.php`) | | Table prefix | `pp_` | | Remote host | `host117523.hostido.net.pl` (hostido.net.pl hosting) | Key tables: `pp_articles`, `pp_articles_langs`, `pp_pages`, `pp_layouts`, `pp_users`, `pp_users_privileges`, `pp_newsletter`, `pp_newsletter_templates`, `pp_banners`, `pp_scontainers`, `pp_authors`, `pp_languages`, `pp_settings`, `pp_tags`, `pp_update_versions`, `pp_update_licenses` ## Frontend Libraries (all vendored in `libraries/`) | Library | Version | Purpose | |---------|---------|---------| | jQuery | 2.1.3 | JavaScript DOM | | Bootstrap | 4.1.3 | CSS/JS framework | | Font Awesome | 4.7.0 | Icons | | jQuery UI | — | UI widgets | | CKEditor | — | WYSIWYG editor | | Leaflet | — | Maps (in CKEditor plugin) | | Plupload | 3.1.2 | File upload | | jQuery Confirm | — | Confirmation dialogs | | FancyBox | — | Lightbox/modal | | CodeMirror | — | Code editor | | Lozad.js | — | Lazy loading | | MotionCAPTCHA | — | CAPTCHA | | FileManager | 9.14.1 | File browse/upload UI | **No build tools** — no webpack, vite, or gulp. Raw JS/CSS files. Custom JS: `libraries/functions.js`, `libraries/functions-front.js`, `libraries/jquery/javascript.js` ## PHP Libraries (vendored) | Library | Location | Purpose | |---------|----------|---------| | PHPMailer | `libraries/phpmailer/` | SMTP email (class.phpmailer.php, class.smtp.php) | | Medoo | `libraries/medoo/medoo.php` | Database abstraction | | MySQLDump | `libraries/MySQLDump.php` | SQL dump utility | | Savant3 | `autoload/Savant3.php` | Template engine | | Mobile_Detect | `autoload/class.Mobile_Detect.php` | 2.8.16, device detection | | geoPlugin | `autoload/class.geoplugin.php` | IP geolocation | ## Server - **Apache** with mod_rewrite, mod_deflate, mod_expires - Config: `.htaccess` — HTTPS redirect, www enforcement, trailing slash, gzip, 1-year browser cache - Optional admin IP whitelist: `admin/ip.conf` - Session: PHP native sessions with IP validation and regeneration - Cache: File-based in `cache/` and `temp/` directories ## External Services | Service | Purpose | Integration | |---------|---------|-------------| | SMTP (configurable) | Email delivery | PHPMailer, settings in `pp_settings` | | geoPlugin (geoplugin.net) | IP geolocation | `class.geoplugin.php` | | cmspro.project-dc.pl | Update downloads | `autoload/admin/factory/class.Update.php` line 12, 25 | | Analytics (configurable) | Stats injection | `pp_settings.statistic_code` → injected in `` | ## Autoloading Hybrid custom autoloader at `autoload/autoloader.php`: 1. Tries `autoload/{namespace}/class.{ClassName}.php` (legacy) 2. Falls back to `autoload/{namespace}/{ClassName}.php` (PSR-4) Composer PSR-4 mappings: `Domain\` → `autoload/Domain/`, `Shared\` → `autoload/Shared/`