Permora · Quickstart
Permora Quickstart, as shipped in the download
The QUICKSTART.txt in the download — the same steps your delivery email carries.
PERMORA — QUICKSTART
====================
Self-hosted permit & inspection tracker for trades contractors — PHP + MySQL/SQLite.
Tracks permits you've already pulled and the inspections they need. It does NOT file
permits with any authority, process payments, sign anything, or give legal advice.
REQUIREMENTS
------------
- PHP 8.1+ with extensions: pdo, pdo_sqlite (or pdo_mysql)
- MySQL 5.7+ / MariaDB 10+ OR SQLite 3 (SQLite requires no extra setup)
- A web server (Apache with mod_rewrite, or Nginx with try_files)
- No Composer packages, no API keys, no external services.
SHARED HOSTING / CPANEL (RECOMMENDED FOR MOST BUYERS)
------------------------------------------------------
1. Upload the contents of the `app/` folder to your web root (e.g. public_html/)
or a subdirectory (e.g. public_html/permora/).
2. Make sure this directory is writable by PHP:
data/
Via cPanel File Manager: right-click -> Permissions -> set to 755 or 775.
3. Visit https://yourdomain.com/install/ in your browser.
4. Fill in the installer:
- Database: choose MySQL (fill in host/name/user/pass) or SQLite (no setup)
- Business name, fee currency, timezone
- Your admin name, email + password
5. The installer writes config.php and redirects you to the login page.
6. Log in, then:
- Create a job (site, client, trade, status)
- Add the permits you've pulled for it (AHJ, number, dates, fee, status)
- Schedule the inspections each permit needs; record results as they come in
TRY IT WITH DEMO DATA FIRST
---------------------------
- On the dashboard, click "Load demo data" for six jobs across all four trades with
a realistic mix of permit and inspection states, then "Reset all data" when done.
- Or from the command line: php bin/demo.php
(login: admin@permora.app / admin123)
THE ALERT WINDOWS (SETTINGS)
----------------------------
- Permit-expiry badges escalate Notice -> Warning -> Critical as the expiry date
approaches. Defaults: Notice 60 days, Warning 30 days, Critical 7 days.
- Change them under Settings. Notice >= Warning >= Critical is enforced.
- "Today" for every overdue / days-until calculation follows your timezone setting.
VPS / SELF-HOSTED (APACHE)
--------------------------
<VirtualHost *:80>
DocumentRoot /var/www/permora/app
<Directory /var/www/permora/app>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
DOCKER (QUICK TEST)
-------------------
docker run --rm -p 8080:8080 \
-v "$(pwd)/app:/var/www/html" \
-w /var/www/html \
php:8.3-cli \
php -S 0.0.0.0:8080 router.php
Then visit http://localhost:8080/install/
REPORTS & EXPORTS
-----------------
- Open a job -> "Report PDF" for its full permit + inspection history (a genuine,
dependency-free PDF).
- "Permits CSV" and "Inspections CSV" (per job, or all jobs from the Jobs page).
Both are safe to open in Excel / Google Sheets (formula-injection hardened) and
keep fee amounts as real numbers.
POST-INSTALL SECURITY CHECKLIST
--------------------------------
[ ] config.php is protected (the .htaccess does this automatically)
[ ] data/ is not web-accessible (.htaccess blocks it automatically)
[ ] Use HTTPS in production
[ ] Keep PHP updated
NOTES
-----
* Permit fees are stored as integer cents; no floating-point rounding touches a total.
* Date math is done in PHP from your timezone's "today", anchored at UTC midnight, so
"days until expiry" is exact and daylight-saving-safe.
* Permora tracks permits only. It never files with an authority, processes payments,
signs documents, or provides legal advice.
← Back to Permora · Manual · API · Test run