diff --git a/.github/workflows/smoke.yml b/.github/workflows/smoke.yml
index e58169a..43aca62 100644
--- a/.github/workflows/smoke.yml
+++ b/.github/workflows/smoke.yml
@@ -143,10 +143,20 @@ jobs:
check "landing /" 200 "http://127.0.0.1:8000/"
check "login /login" 200 "http://127.0.0.1:8000/login"
+ check "marketing /vibe" 200 "http://127.0.0.1:8000/vibe"
+ check "marketing /agency" 200 "http://127.0.0.1:8000/agency"
check "/api gateway alive" 200 "http://127.0.0.1:8000/api"
check "unknown slug 404" 404 "http://127.0.0.1:8000/no-such-page-xyzzy"
check "org-scoped CMS page" 200 "http://127.0.0.1:8000/ci-smoke-page"
+ # The home page must carry the Solutions mega-menu (its cards link to the marketing pages).
+ curl -s "http://127.0.0.1:8000/" >home.html || true
+ if grep -q 'tiger-mega' home.html && grep -q 'href="/vibe"' home.html && grep -q 'href="/agency"' home.html; then
+ echo "PASS home carries the Solutions mega-menu + audience links"
+ else
+ echo "FAIL home missing mega-menu / audience links"; fail=1
+ fi
+
# The seeded page (org_id = the site org) must actually DISPATCH — its body has to render, not a
# 404 shell. This is the guard for the org_id write-stamp ↔ read-scope path: a mismatch 404s here.
curl -s "http://127.0.0.1:8000/ci-smoke-page" >page.html || true
diff --git a/core/controllers/IndexController.php b/core/controllers/IndexController.php
index ecd2c0d..abbdb7a 100644
--- a/core/controllers/IndexController.php
+++ b/core/controllers/IndexController.php
@@ -42,6 +42,27 @@ public function indexAction()
$this->view->zendVersion = Zend_Version::VERSION;
}
+ /**
+ * `/vibe` — the SaaS-startup / "vibe coding" pitch (the former home page). A shipped marketing
+ * page; the view owns its content. Routed via _initMarketingAliases.
+ *
+ * @return void
+ */
+ public function vibeAction()
+ {
+ // view: index/vibe.phtml — nothing to wire; it's static marketing.
+ }
+
+ /**
+ * `/agency` — the agency story (one client or a hundred). A shipped marketing page.
+ *
+ * @return void
+ */
+ public function agencyAction()
+ {
+ // view: index/agency.phtml
+ }
+
/** The configured home-page id (tiger.site.home_page), or '' for the built-in landing. */
protected function _homePageId()
{
diff --git a/core/views/scripts/index/agency.phtml b/core/views/scripts/index/agency.phtml
new file mode 100644
index 0000000..e57f42e
--- /dev/null
+++ b/core/views/scripts/index/agency.phtml
@@ -0,0 +1,113 @@
+title = 'Agency friendly — host hundreds of client sites | Tiger';
+
+$benefits = [
+ ['fa-diagram-project', 'One install, many tenants', 'Every client is an org on the same platform — isolated data, their own users and roles, their own theme and content. Add a client, not a server.'],
+ ['fa-gauge-high', 'Jumpstart every project', 'New client on Monday, a running multi-tenant site the same day. Skip the auth/roles/CMS boilerplate you rebuild on every engagement and go straight to their brief.'],
+ ['fa-palette', 'White-label per client', 'Theme and skin resolve per org, so each client sees their brand — not yours, and not a template. Swap looks live with no redeploy.'],
+ ['fa-user-shield', 'Scoped access, safely', 'Deny-by-default ACL with roles on the membership. Give a client access to their org and nothing else; add a teammate as manager here, viewer there.'],
+ ['fa-server', 'Runs where you host', 'cPanel, a $5 VPS, or a fleet behind a load balancer — zero build step, tiny footprint. Host hundreds of sites without a hosting bill that eats the margin.'],
+ ['fa-sliders', 'Live config, no deploys', 'Change a client\'s settings, copy, or branding from the admin — the config and translation tiers override at request time, so edits ship without a release.'],
+];
+?>
+
+
+ Tiger is multi-tenant to the core, so a single install runs all your client sites — each
+ isolated, white-labeled, and managed from one back office. Jumpstart every project and
+ keep the margin the hosting bill used to eat.
+
+ Stand up a polished, secure site for one client without wiring auth, roles, and a
+ CMS from scratch. Everything's included — you focus on their brief, not the boilerplate.
+
+ Run your whole book on one platform — every client an isolated tenant with its own
+ users, roles, theme, and content, all from a single admin. Add the next client in minutes.
+ Isolated tenants, white-label branding, live config — no per-client rebuild. = $this->escape($b[2]) ?> One command scaffolds a running, themed, multi-tenant platform you can grow onto.One client, or a hundred.
+ Solo & single-client
+ Multi-client at scale
+ Built for the way agencies actually work
+ = $this->escape($b[1]) ?>
+ Turn your next client into a tenant
+
+ $ cd my-agency && vendor/bin/tiger install:admin
+
- 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.
+
+ Tiger is a 1-click, multi-tenant foundation for PHP — auth, orgs, roles, a CMS, theming,
+ i18n, and a clean /api. Whether you're building a website, a SaaS, or a hundred
+ client sites, you start with product, not plumbing.
- 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. -
+ += $p[4] ?>
+ Explore- 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. -
-
- 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.
-
- 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. -
-- 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. -
-- 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. -
+- 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. -
-
- 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.
-
- 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. -
-- 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. -
-- 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. -
-
+ Tiger hands you the boring-but-essential SaaS substrate — auth, orgs, roles, billing-ready
+ multi-tenancy, i18n, and a clean /api — so you and your AI pair ship
+ product from the first commit. Predictable patterns your assistant reads before it
+ writes, so the vibe code doesn't rot.
+
+ + Flip light/dark or the skin in the header — this page restyles live, no reload. +
++ 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. +
++ 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. +
+
+ 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.
+
+ 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. +
++ 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. +
++ 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. +
+The boring-but-essential substrate, done right.
+= $this->escape($f[2]) ?>
++ 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. +
+
+ 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.
+
+ 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. +
++ 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. +
++ 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. +
+One command scaffolds a running, themed, multi-tenant app.
+