Reference
What leaves a site
Exactly what a connector sends to Porro, what it never sends, and every outside service it talks to.
Without a Porro account, nothing about the site is sent anywhere: the panel's checks look up public data, and activity stays on the site.
Once connected, a connector sends one signed report on a schedule (PHP) or per build (JavaScript). Run porro:status --json (porro/status --json on Craft, --dry-run for JavaScript) to see the exact report.
In a report
- Versions: PHP and the framework (Laravel, Statamic, Filament, Craft), and package names and versions from the lock file. The package list is only sent when the lock file changes.
- The environment's name, and whether debug or dev mode is on, as true or false, never the value of any setting.
- Health facts: the scheduler or cron heartbeat, failed jobs in the last 24 hours, pending migrations and the queue.
- Failed jobs: the job's name, the exception class and where it was thrown, how many and when. Not the job's data or the message.
PORRO_FAILED_JOB_MESSAGES=trueadds each message's first line, cut to 160 characters, with email addresses, file paths and long numbers replaced. - The database: its engine and version, whether it's on the same server, and the provider if it's a known managed database. Never its host, name, user or password.
- Backups and health checks, from
spatie/laravel-backupandspatie/laravel-healthif installed. - The server: the operating system's name and version, the kernel, whether a reboot is waiting, and a hashed machine ID, so sites on one server are grouped as one server.
- The server's packages (Ubuntu and Debian): installed package names, versions and sources, and whether unattended upgrades are on and when they last ran, so Porro only raises the Ubuntu and Debian security notices that apply. The full list is only sent when Porro asks for it; otherwise just a hash of it.
Never
Content, entries, customer or user data, environment values or secrets.
How reports are signed
Each report is signed with Ed25519 using the site key. The key's private half stays on the site; Porro stores only the public half. A signature covers the method, the path, a timestamp, a one-time nonce and the body, so Porro rejects anything unsigned, altered, more than five minutes old or replayed. The site only ever sends: Porro never connects in and never sends commands. Reading the site's findings back is a GET from the site, signed with the same key.
Outside services
| Service | When | What's sent |
|---|---|---|
packagist.org |
Advisory check, at most every 6 hours or when the lock file changes | Package names |
endoflife.date |
Support dates, at most once a day | Nothing beyond the request |
| Cloudflare, Google, Bing, Forge | Always-protected address lists, at most once a day | Nothing beyond the request |
check.torproject.org, spamhaus.org |
Tor exit list (hourly at most) and DROP lists (daily) | Nothing beyond the request |
download.db-ip.com |
The free country file, monthly, in production | Nothing beyond the request |
| DNS | When an IP's details are opened | The IP |
api.cloudflare.com |
Only with PORRO_CLOUDFLARE_TOKEN |
Blocked addresses and their reasons; looked-up IPs |
api.abuseipdb.com |
Only when someone clicks Check on AbuseIPDB | The IP |
app.porro.dev |
Only once connected | The signed report |