Built on TigerZF Β· ZendFramework 1 for modern PHP

Build the SaaS, not the plumbing.

Tiger is a 1-click, multi-tenant SaaS foundation for PHP β€” auth, orgs, roles, theming, i18n, and a clean /api β€” so you ship product from day one. Front-end agnostic, zero build step.

Flip light/dark or the skin in the header β€” this page restyles live, no reload.

Startup-friendly

Zero to a running, themed, multi-tenant app in one command β€” on a $0 stack if you want. No infra to stand up, no boilerplate to write. Spend your runway on product, not plumbing.

Enterprise-class MVPs

Auth, role-based access, audit logging, multi-tenancy, i18n, and live config β€” the substrate enterprises spend months on β€” ship with your first commit. Your MVP is production-shaped out of the gate.

Structured for vibe coding

Predictable patterns, docs that live in the code, and an AGENTS.md your AI assistant reads before it writes. Describe what you want and let the conventions keep it clean β€” vibe code that doesn't rot.

Built for speed

runs on
PHP 8.x+

A lean core with no per-request framework bloat β€” zero build step, tiny memory footprint, OPcache-tuned. Flies on a $5 shared host, not just a beefy server. Fast is the default, not an upgrade.

The numbers don't lie

responds in
~10 ms

Steady at the median, the 95th, and the 99th percentile — the tail stays flat under load, not just on a quiet box. That's the raw cost of generating a real page, with no output cache and no tricks. Consistent, with zero errors.

The competition

up to
3–10×

faster than Laravel, Next.js, or Django + ORM at generating the same dynamic page — most of their time is framework plumbing, not your code. And Tiger does it on a $5 shared host those stacks can't even run on. Lean beats heavy.

~10 ms measured (single warm request, 2‑vCPU box, PHP 8 + OPcache). Multipliers reflect typical per‑request generation times for an equivalent dynamic page vs. mainstream framework defaults — not a controlled benchmark; results vary by workload and hardware.

Everything a SaaS needs, none of the busywork

The boring-but-essential substrate, done right.

Front-end agnostic

Server-rendered .phtml or any SPA (React, Vue, …) against one JSON /api. The core ships no UI framework β€” build the front end however you like.

Multi-tenant by default

Orgs, users, and memberships out of the box. A user can be admin in one org and viewer in another β€” roles live on the membership.

Zero build toolchain

No npm, no webpack, no Sass. composer install and the UI renders. Assets are vendored; a build tool only appears if a theme opts in.

i18n with live overrides

Semantic keys, language-only locales, /es/ URLs. Change any string in production with no deploy β€” same for config.

Auth & ACL included

Password policy, lockout, DB sessions, an audit log, and a deny-by-default ACL with live, per-tenant roles.

Pluggable logging

Structured JSON logs to error_log, stderr, syslog β€” or straight to CloudWatch / GCP / Azure. Switch with one config line.

Live theming & skins

Light/dark and swappable skins that hot-swap with no reload β€” per user and per org. Try the switchers above ↑

Batteries-included CLI

bin/tiger migrate, install:admin, make:module β€” scaffold a live module (controller + /api service + ACL) in seconds.

Webservices — the TIGER pattern

REST without the bloat

One endpoint. The message says where it's going. Add a method and it's live — no route to design, no verb to argue about, no endpoint zoo to maintain.

One endpoint, not 50

A single /api. The module + service + method ride in the message, so a new call is a new method — not a new route, a new controller, and a new version to babysit.

Secured by ACL

Every call is authorized before it runs — deny-by-default, resource = the service, privilege = the method. Auth isn't a check you can forget to write; it's the gateway you can't route around.

Stateless or stateful

Ride the session for a first-party UI, or go token-based and stateless for a public API or a mobile client — the same services answer either way. Pick the model per surface, not per framework.

Discoverable by design

Because routing is data in the message, the API can describe itself — versioned services and an OpenAPI / Swagger catalog fall out of the pattern, not a bolt-on spec you keep in sync by hand.

Spin up your app in minutes

One command scaffolds a running, themed, multi-tenant app.

$ composer create-project webtigers/tiger my-app
$ cd my-app && vendor/bin/tiger install:admin