We delivered an empty Statamic installation with no starter kits, no pre-built themes. While Statamic offers starter kits to accelerate development (design systems, page builders, boilerplate content), we deliberately built without.
The foundation uses Statamic's Eloquent driver to persist all content and configuration to the database, enabling true multi-tenancy at the data layer. This approach gave SchleeGleixner full control to build their design delivery workflows without inheriting unnecessary structure.
Tenant resolution within SchleeGleixner: Tenant identification happens automatically via subdomain. When a request hits clientA.schlegleixner.com, middleware intercepts the subdomain, queries the tenants table, resolves the tenant ID, and injects it into the application container. Every subsequent operation: database queries, file storage, authentication checks, inherits this tenant context.
The technical implementation is then followed by a root domain routing. This is configured in Laravel's routes/web.php. The root domain (schlegleixner.com) serves as the landing page or administrative interface, while subdomains route to tenant-specific environments. In our case, to the content and user management which is fully database-backed. All content entries, user accounts, and permissions live in the database with tenant_id foreign keys. This allows dynamic, tenant-specific content without filesystem coupling.
Then there is super user access. The Statamic super user can authenticate into any tenant environment - a deliberate design choice by SchleeGleixner for administrative oversight. This cross-tenant access is scoped to super users only; regular tenant users remain isolated and so is email and queue isolation. Emails, queues, and jobs are tenant-scoped. When a job is dispatched, it carries the tenant_id in its payload, ensuring background processes (email notifications, asset processing) execute within the correct tenant context. Stencil's tenant-aware job traits handle this automatically.
In addition to email and queue isolation, it is asset isolation. Here, (logos, brand materials, deliverables) are encapsulated per tenant. File paths are namespaced by tenant_id, preventing cross-tenant access. A client accessing clientA.schlegleixner.com can only retrieve assets stored under Tenant A's directory. Statamic's content structures (blueprints, field sets) are shared across tenants. This centralization is intentional to SchleeGleixner's design delivery process which follows a standardized workflow. Sharing these structures means updates to the content model propagate to all tenants instantly, maintaining consistency without manual synchronization.
Stored in the filesystem using Statamic's default file driver are roles and groups. While content and users are database-backed, permission structures remain file-based. This hybrid approach balances flexibility (tenant-specific users) with simplicity (globally defined roles). These permissions grant authentication and asset access. Image retrieval requires authentication. We implemented an authenticated route that validates three conditions before serving an image:
(1) the user is logged into the current tenant and has an active session
(2) the requested image belongs to that tenant's asset directory
If any condition fails, the request is denied. This ensures tenant A users cannot construct URLs to access tenant B's assets. Authentication and asset ownership are enforced at the application layer, not just filesystem permissions. When a client visits clientA.schlegleixner.com, they're prompted to log in.
Once authenticated, their session is scoped to Tenant A. They can browse Tenant A's content, upload assets to Tenant A's storage, and view Tenant A's deliverables. But they cannot see or even request resources from Tenant B. The tenant boundary is absolute.