Working inside someone else's codebase
Read first, then pin behavior down
The first week on an inherited application is spent reading. We list the routes, trace the main flows from request to database, and check what runs outside the request: queued jobs, scheduled commands, model observers and event listeners, which is where surprising behavior tends to hide. Then we write characterization tests. These do not judge whether the current behavior is right. They record it, so that when we change something we find out at once if an unrelated screen moved too.
Extend in the application's own style
If the codebase uses service classes, we add service classes. If it leans on fat models and that is working, a new module is not the moment to introduce a different architecture. Consistency matters more than our preferences, because your next developer has to hold one mental model, not two. Where the existing pattern is the cause of the pain, we say so in the audit and agree a gradual refactor as its own piece of work.
Filament or Nova for the back office
A good admin panel is often the highest-value customization. Filament is a community project built on Livewire, and it is our usual choice when the panel needs custom pages, widgets and complex forms. Nova is the admin panel made by the Laravel team and fits standard resource management well. Both read your existing Eloquent models and policies, so permissions stay defined in one place. We advise against bolting a panel onto models that have no policies at all. That step comes first.
Packages, forks and the vendor folder
Edits made inside the vendor directory are the most common trap we find. They vanish on the next install and block every update. We move each one into your own code, through a service provider binding, a subclass, a macro or a published config file, and restore the original package. If a dependency is abandoned we replace it or take it over as a private package with its own tests. When the framework release itself has fallen out of support, a Laravel upgrade is planned before large new features go in.
Releasing changes to an application in use
New behavior ships behind a feature flag where it can be turned on for staff before customers. Migrations on large tables are written to avoid long locks. Each release has a rollback path that has been tried on staging against a recent copy of production data, with personal details masked.