Development
# MariaDB running locally, then:
cp -n config.example.php /tmp/align-config.php # edit db credentials and set app_key (the file shows how to make one)
export ALIGN_CONFIG=/tmp/align-config.php
php bin/align migrate
php bin/align user:create --email=dev@example.com
php -S 127.0.0.1:8099 tests/mock-server.php & # fake ITFlow/HaloPSA/NinjaOne/Tactical RMM/Datto RMM/KnowBe4/Veeam/Dell/Lenovo (+ tests/mock/*.php)
php -S 127.0.0.1:8080 -t public tests/dev-router.php
To point at the mocks, add 'allow_insecure_integrations' => true to the config (the mocks are plain http://) and set ninja_instance, itflow_url, veeam_url, dell_api_base and lenovo_api_base to http://127.0.0.1:8099 in the settings table. The mock credentials are ninja-id / ninja-secret and itflow-key.
Tests: tests/e2e/run.sh builds a throwaway install (fictional data from tests/mock-server.php), starts the app and the mock server and runs every end-to-end suite; see tests/README.md. GitHub Actions runs them on every push and pull request.
Adding an integration: php bin/align make:connector <rmm|psa|backup|saas> "Product name" writes a working connector from a template, with a mock API and a test suite, and registers it; see Writing a connector and the review checklist. By hand: write a class in src/Integrations/Connectors/ that extends Align\Integrations\Connector (name, icon, category, summary, fields(), setup() steps, configured() and test()), and add it to Registry::CONNECTORS. Its card, settings page, form, validation (https-only URLs, encrypted secrets, nothing saved on an error), Test button, audit log entries, security alert on key changes and status badge (from the sync steps named in syncSteps()) come from the base class. Field types: text, url, secret, select, switch, checkboxes, number.
Profiling: add 'profile' => '/tmp/align-profile.log' to the config and each request appends its time, query count, database time, slow queries ('profile_slow_ms', default 50) and repeated queries.
Layout: public/ web root (public/vendor/ = bundled AdminLTE, Bootstrap, Font Awesome, the Inter typeface, FullCalendar, PDF.js, Quill; see their LICENSE files) · src/ app code (no framework, no Composer) · views/ templates · db/migrations/ numbered SQL and PHP files applied once each · deploy/systemd/ timers · scripts/ update and backup.

Suggest