Choosing Boring Technology: Laravel and Filament for Musaned

This is part 2 of the Musaned series. Part 1 covered why we decided to build instead of buy.

When you're one engineer promising to deliver what a vendor priced beyond reach, your stack choice is not a technology decision — it's a survival decision. Every hour spent wiring infrastructure is an hour not spent shipping the features that justify the project's existence.

The actual requirements

Strip away the buzzwords and Musaned's technical profile was clear: an internal tool used by employees, dominated by CRUD over business data, heavy on tables, forms, filters, and exports, with strict permissions and a growing list of integrations to other systems. No public traffic. No app-store presence. The users are colleagues on the corporate network.

That profile points away from the fashionable answer (an SPA framework talking to a hand-rolled API) and toward something older and calmer: a server-rendered monolith with a first-class admin framework.

Why Laravel

Laravel earns the "boring" badge in the best way. Eloquent handles 90% of data access cleanly. Queues, scheduling, caching, and notifications are built in — all things an integration-heavy internal platform needs on day one. The ecosystem is mature; when I needed permissions, media handling, or auditing, there was a battle-tested package rather than a weekend of yak-shaving. And critically for a system that would outlive my solo phase: any PHP developer we'd hire later could be productive in week one.

Why Filament

Filament v3 is the multiplier in this story. An internal BSS is essentially dozens of resource screens: list, filter, create, edit, authorize, export. Hand-building those in a frontend framework is weeks of work per module. In Filament, a resource is a PHP class — the table, form, filters, and actions are declarative, and the result looks professional without a designer on the team.

That velocity had a compounding effect I only appreciated later: when stakeholders see their request live in days, they bring you the next request instead of taking it to the vendor. The speed of the stack literally shaped the platform's roadmap, because trust arrived faster than skepticism could.

The trade-offs, honestly

A monolith with an admin framework has limits. Highly custom UX means fighting the framework's opinions. Long-running heavy work doesn't belong in the request cycle — which is fine, because Laravel's queues exist, and a later post in this series covers how queue design kept 2M-record batch jobs from interrupting daily operations. And tying business logic into admin resources is a temptation you must resist: from the start, the rule was that resources stay thin and real logic lives in service classes — a decision that paid for itself when the integrations multiplied.

Boring technology isn't a compromise. For an internal platform with one engineer and enterprise expectations, it was the only choice that made the math work.

Next in the series: identity first — syncing employees over LDAP and designing RBAC strict enough for an enterprise.

Leave a Reply

Your email address will not be published.

Navigation

Socials