# Tech Stack ## Backend | Component | Version | Notes | |---|---|---| | PHP | 5.6+ assumed (no explicit constraint) | No `composer.json`, no `declare(strict_types)` | | MySQL | unspecified | Schema in [migrations/](migrations/) | | Medoo ORM | 1.7.10 | [libraries/medoo/medoo.php](libraries/medoo/medoo.php), used via global `$mdb` | | RedBeanPHP | bundled | [libraries/rb.php](libraries/rb.php), used in [api.php](api.php) and [cron.php](cron.php) | | PHPMailer | bundled | [libraries/phpmailer/](libraries/phpmailer/) | **Autoloader:** custom `spl_autoload_register` in [index.php](index.php) maps namespaces to `autoload/{layer}/class.{Name}.php`. No Composer. ## Frontend | Library | Version | Source | |---|---|---| | jQuery | 3.6.0 | CDN | | jQuery UI | bundled | [libraries/framework/vendor/jquery/jquery_ui/](libraries/framework/vendor/jquery/jquery_ui/) | | Bootstrap | 5 (active) + 4.1.3 (legacy) | CDN + [libraries/bootstrap-4.1.3/](libraries/bootstrap-4.1.3/) | | DataTables | 2.1.7 | CDN | | Highcharts | latest | CDN | | Select2 | 4.1.0-rc.0 | CDN + [libraries/select2/](libraries/select2/) | | Font Awesome | 6.5.1 (active) + 4.7.0 (legacy) | CDN + [libraries/font-awesome-4.7.0/](libraries/font-awesome-4.7.0/) | | Moment.js | 2.18.1 | CDN + [libraries/moment/](libraries/moment/) | | Date Range Picker | bundled | [libraries/daterange/](libraries/daterange/) | | CKEditor | bundled | [libraries/ckeditor/](libraries/ckeditor/) | Custom assets: [libraries/adspro-dialog.js](libraries/adspro-dialog.js), [libraries/functions.js](libraries/functions.js), [libraries/xlsxwriter.class.php](libraries/xlsxwriter.class.php). ## Styling - SCSS: [layout/style.scss](layout/style.scss) → [layout/style.css](layout/style.css) (manual compilation; no automated build pipeline) - Source map present: [layout/style.css.map](layout/style.css.map) ## Configuration - [config.php](config.php) — DB credentials, SMTP settings (plaintext; see [concerns.md](concerns.md)) - `settings` DB table — runtime config, API keys, cron state, feature flags. Accessed via `\services\GoogleAdsApi::get_setting($key)` / `set_setting($k, $v)` (used globally despite the class name). ## Tooling absent - No Composer / package.json / lockfiles - No PHPUnit / phpcs / phpstan - No `.editorconfig`, no `.github/workflows`, no CI - No linting / formatting config