How protected builds are produced and deployed. Encoding happens on your machine (or ours, if you use the managed option); your customers only install a loader extension and run the protected code.
Copy the loader for the customer's PHP version into the extension directory, point it at the customer's private key and restart PHP-FPM. Protected files then run like ordinary PHP — your application code does not change.
extension = darwvin.so
darwvin.customer_privkey = /etc/darwvin/customer_priv.pemEach customer gets their own key pair, so a build made for one customer cannot be unlocked with another customer's key. The signing key that proves a build came from you stays private to your team.
If you want a build to run on one specific machine, the customer runs a one-line script that prints a server fingerprint, and you pass it when encoding.
Encoding walks the source tree and writes protected files that keep your folder structure. Locks are embedded in each build: allowed domains, allowed IPs or CIDR ranges, a machine fingerprint, an install path prefix, an activation date, an expiry date, and optionally an online license check with an offline grace period.
--domains example.com,*.example.com
--ips 203.0.113.5,10.0.0.0/8
--machine-id <server fingerprint>
--allowed-paths /var/www/myapp
--not-before 2026-06-01
--expire 2027-12-31
--license-url https://licenses.example.com/v1/check
--offline-grace-sec 604800Ship the protected directory to the customer along with their private key. A quick check on their server confirms the loader is active before anything goes live.
php -m | grep darwvinWe agree the delivery model with each customer: encoding as a managed service, or a self-hosted setup when source must never leave your infrastructure. Loader builds are provided for the PHP versions your customers run.