Store it in a central source of truth, deliver it securely (API or generated config), cache it when appropriate, and expose only what's needed to the client.
The less engineering is involved in branding updates, the more scalable your platform becomes.
One lesson from building white-label SaaS platforms:
If changing a tenant's logo or brand colors requires a deployment...
your configuration strategy doesn't scale.
Treat tenant configuration as data, not deployment.
#SoftwareArchitecture#SaaS#PlatformEngineering
If 5 repositories share the same database...
Who owns the schema?
One might thing "individual repos", the answer is usually "one."
As systems grow, migration ownership becomes an architectural concern, not a framework concern.
#SoftwareArchitecture#BackendEngineering#SaaS
This changes EVERYTHING
I just announced on stage at @LaraconEU that the FIRST EVER iPhone app to built on @LaravelPHP and @LaravelLivewire has been released on the iOS App Store
Yes, you read that right!
PHP now has Apple's approval as a legitimate way to build iOS apps
🔥
For cross-cutting concerns (caching, tenant resolution, feature flags, logging, etc.), shared packages often scale far better than copy-paste development.
What starts as convenience eventually becomes distributed technical debt.
#SoftwareArchitecture#BackendEngineering#SaaS
One architectural mistake I see repeatedly in multi-repo SaaS systems:
Copying shared logic across repositories.
It feels faster initially.
#SoftwareArchitecture#BackendEngineering#SaaS
The biggest issue is cultural.
Many developers see obsolete logic and think:
“Someone else will clean it up.”
But scalable engineering teams treat code removal as part of engineering ownership — not optional cleanup.
Every unused line in production has a long-term cost.
Dead code rarely breaks systems immediately.
That’s what makes it dangerous.
Over time, it silently increases:
• debugging complexity
• onboarding confusion
• maintenance overhead
• cognitive load across teams
#TechnicalDebt#SoftwareArchitecture#BackendEngineering
At scale, repeated inefficiencies like this lead to:
• higher DB load
• CPU spikes
• stressed connection pools
• inconsistent latency
A better approach:
$user = User::select(['id', 'name', 'phone'])
->where('id', $id)
->first();
That enables:
• faster onboarding
• cleaner architecture
• easier feature management
• lower operational overhead
Multi-tenant systems should be tenant-agnostic and configuration-driven by design.
Hardcoded tenant logic works for the first 5 tenants.
It becomes technical debt at 50.
One mistake I’ve seen in SaaS multi-tenant systems:
Embedding tenant-specific conditions directly into business logic.
#SaaS#SoftwareArchitecture#BackendEngineering
In shared-schema architectures with multiple services/modules, this quickly becomes difficult to scale and maintain.
A better approach:
→ Treat tenant resolution as infrastructure/configuration, not application logic.
@simonhamp For a long time it is being said that AI improves productivity. So instead of equipping existing workforce with AI and increase the output 100x or 200x in order to be more profitable.
Why are layoffs still happening?
If you're a junior arguing that AI now makes you a senior so you should be paid equivalent, go build something!
You'll soon see that a senior does a lot more than just produce good code quickly
A real senior understands the business problem, the user problem, and the infrastructure challenges deeply
They can prioritise and discard the right things at the right time to keep a project moving along
They can work as part of a team, not just at the desk next to someone, but proactively helping teammates reach flow state
Even with AI, you won't learn how to do most of this well until you're at least 5 years into the job