Multi-tenant Isolation
Per-tenant data isolation via a workspace_id foreign key + a global scope on every model, plus middleware that resolves the current workspace from subdomain, header, or session. Background jobs serialize the tenant so a queue worker can't leak across tenants. Tested against the "wrong tenant" assertion in feature tests — defence-in-depth against scope drift.
Projects
- CodeIgniter → Laravel strangler (PTIprint API)2024-08-01
Strangler-pattern migration of a CodeIgniter API to Laravel — new routes in Laravel, legacy routes proxied until cut-over.
Industry: saas - CodeIgniter → Laravel port (MorTrack)2024-06-15
Full port of a legacy CodeIgniter SaaS to Laravel — keeping data shape, modernizing the runtime + auth layer.
Industry: saas - Applicant tracking system2025-08-15
ATS with pipeline kanban, candidate notes, interview scheduling, GDPR-compliant data subject flows.
Industry: recruiting - Custom LMS2025-04-01
Multi-tenant LMS with course progress, quizzes, certificates, instructor dashboards.
Industry: education - E-commerce merchant portal2025-02-15
Per-merchant SaaS portal — orders, inventory, payouts, Stripe-backed billing.
Industry: e-commerce - Legal intake portal2024-09-15
Multi-tenant intake portal for a law firm — case-type wizards, document upload, e-signature flow.
Industry: legal - Client Portal SaaS2025-12-01
Multi-tenant client portal for service businesses — per-tenant data, invoices, file-sharing, role-based access.