SaaS Kit · Quickstart
SaaS Kit Quickstart, as shipped in the download
The QUICKSTART.txt in the download — the same steps your delivery email carries.
OWNWARE SAAS KIT — QUICK START
WHAT THIS IS
A multi-tenant control plane that turns a single-tenant Ownware product into a SaaS you
operate/resell. Each tenant gets its OWN separate database (isolation by construction).
Targets a VPS/operator — per-tenant DBs need CREATE-DATABASE privileges (not a $3 shared host).
INSTALL (2 minutes)
1. Upload the contents of app/ to your control-plane web root (e.g. saas.yourdomain.com).
2. Point wildcard DNS *.app.example.com at this server (add it as a ServerAlias).
3. Open the domain in a browser — the installer starts. Enter your control-DB details,
your wildcard app domain, and your operator (super-admin) account.
4. Put each product's app/ on the box and point its adapter (app/products/<slug>.php) at it.
LOCAL TEST DRIVE
php -S localhost:8000 router.php (uses bundled zero-config SQLite)
Signup: http://localhost:8000/
Operator: http://localhost:8000/admin/login
SEED A DEMO
php bin/seed.php -> operator admin@ownware.test / admin12345 + ~8 demo tenants across
products/plans/statuses (products not on your box are skipped)
php bin/demo.php -> reset + reseed the demo
WIRE A PRODUCT (~1 hour, mostly copy)
1. In the product's index.php, read $GLOBALS['__ownware_tenant_config'] before config.php
(the "boot shim" — already applied to Slotly in this catalog).
2. Copy app/products/slotly.php, point app_path at the product, and make the install closure
reuse the product's own installer. Add it to the products map in config.php.
BILLING
Demo mode (default) simulates the lifecycle with NO live charge and NO keys.
For live billing: set billing.provider = 'stripe' (or 'lemonsqueezy') + your keys in config.php,
and point the provider's webhook at https://<app-domain>/billing/webhook . Keys are never logged.
TESTS
Core: docker run --rm -v "$PWD/app:/app" -w /app php:8.3-cli php tests/run.php
Isolation: php app/tests/isolation_all.php -> proves per-tenant DB isolation for EVERY
registered product installed on your box (missing products are skipped).
See README for the single-product live proof too.
Full docs in README.md.