
No Compromises
Two seasoned salty programming veterans talk best practices based on years of working with Laravel SaaS teams..
Joel Clermont and Aaron Saray · Joel Clermont
Show overview
No Compromises has been publishing since 2020, and across the 6 years since has built a catalogue of 154 episodes. That works out to roughly 35 hours of audio in total. Releases follow a fortnightly cadence.
Episodes typically run ten to twenty minutes — most land between 12 min and 15 min — and the run-time is fairly consistent across the catalogue. None of the episodes are flagged explicit by the publisher. It is catalogued as a EN-language Technology show.
The show is actively publishing — the most recent episode landed 1 weeks ago, with 12 episodes already out so far this year. Published by Joel Clermont.
From the publisher
Two seasoned salty programming veterans talk best practices based on years of working with Laravel SaaS teams.
Latest Episodes
View all 154 episodesHow much logic is too much logic in a PHP enum
Your codebase is not a museum for old code
Do you actually own the code you ship?
Do you actually need a multi-tenancy package?
Ep 150Local and production should match even for Laravel tools
Ever installed a Laravel package locally and immediately accessed it, only to wonder later whether your access controls are actually working in production?In the latest episode of the No Compromises podcast, we discuss why tools like Telescope and Horizon behave differently in local environments versus production, and why that inconsistency is a problem worth solving.We make the case that developer convenience should never come at the cost of security confidence. If your gate logic cannot be exercised locally, you cannot truly trust it is protecting your production environment.We also dig into how Aaron worked around the issue by overriding the package's service provider logic, and why Laravel has since made this easier to handle cleanly.(00:00) - Why local and production environments should match (01:42) - How Telescope's gate logic behaves differently locally (03:01) - The risk of untestable access control logic (07:53) - How Aaron overrode the service provider to fix it (10:23) - Silly bit (00:00) Why local and production environments should match(01:42) How Telescope's gate logic behaves differently locally(03:01) The risk of untestable access control logic(07:53) How Aaron overrode the service provider to fix it(10:23) Silly bitOur courses took the production hits so your app doesn't have to.

Ep 149When weird code needs to explain itself
Have you ever looked at a colleague's code and thought, "This is clearly wrong," only to find out it was actually a well-reasoned workaround for a tricky bug?In the latest episode of the No Compromises podcast, we discuss what happened when Aaron reviewed Joel's code and couldn't make sense of a pattern spread across multiple Livewire components.The code wasn't bad, it was solving a real UX flicker bug in an older version of Mary UI. But without context, it looked like a mistake and nearly got rejected. The fix wasn't just refactoring; it was giving the workaround a proper home: a trait with a descriptive name, clear method names, and thorough documentation explaining the bug, the reason for the pattern, and when it can eventually be removed.We also talk about why "the explanation is in the PR note" isn't good enough, how AI coding agents can unknowingly propagate patterns they don't understand, and why strange code deserves to look strange, on purpose.Explore Mastering Laravel resources to deepen your understanding of patterns like these.00:00 The confusing code review that started this01:15 Flagging the unclear pattern across components03:54 The Mary UI toast flicker bug explained05:45 Naming, documentation, and protecting the whole team09:30 Silly bit

Ep 148Are you testing your app or just the framework?
Do you ever finish writing a test and wonder if it is actually proving anything about your code or just confirming that Laravel works?In the latest episode of the No Compromises podcast, we discuss how to tell the difference between tests that validate your logic and tests that merely exercise the framework.We share a practical gut check: if you cannot make a test fail by changing something in your own application code, it probably should not be in your test suite. We also look at this idea from the other direction, asking whether the code being tested is something we actually wrote.We also dig into why testing validation rules is worth the effort even when they feel boilerplate, how feature versus unit test style shapes these decisions, and why the real goal is simply getting to a place where your tests help you ask the right questions.Join the Mastering Laravel community at https://masteringlaravel.io/community00:00 Are we testing code or framework02:00 Joel metric for framework-only tests05:15 Bottom-up testing perspective by test type07:36 Why validation rules still deserve tests10:40 Silly bit
Ep 147Being anti-hype does not mean being anti-AI
Does everyone need to have an AI hot take right now, or is there value in waiting until you actually know what you're talking about?In the latest episode of the No Compromises podcast, we discuss why it took us 147 episodes to finally tackle the topic of AI.We dig into the tension between wanting to speak with authority and feeling pressure to share before you're ready. Aaron makes the case for building deep knowledge first, while acknowledging that people at every stage of the learning curve play an important role in moving the community forward.We also talk about how fast the AI landscape is shifting, why zooming out matters more than memorizing details, and why being a slower mover isn't something to apologize for.(00:00) - Why we haven't talked about AI yet (01:00) - Building deep knowledge before sharing opinions (02:30) - AI moves faster than JavaScript frameworks (04:30) - Zoom out before sweating the details (06:15) - Every stage of the learning cycle matters (07:45) - Silly bit Want to get that new AI tip we mentioned? Sign up for the Mastering Laravel newsletter.
Ep 146Three ways to plan an upgrade when your codebase is a patchwork
When your project has the same thing done three different ways, how do you bring everything up to date with a consistent approach?In the latest episode of the No Compromises podcast, we discuss different strategies for tackling upgrades when parts of your codebase are multiple versions behind.We walk through two main approaches and weigh the tradeoffs for both the developer doing the work and the person reviewing it.(00:00) - Setting up the upgrade scenario (02:15) - Approach one: upgrade each area to current (04:00) - Why the reviewer's experience matters too (07:30) - A third approach neither one expected (09:00) - Silly bit Want help upgrading your Laravel project?
Ep 145Stop doing math in your config files
Ever feel the urge to write out calculations in your code to make them "self-documenting"?In the latest episode of the No Compromises podcast, we discuss why inline math in configuration values is a habit worth breaking.Aaron argues that if a value never changes, there's no reason to calculate it every time. A well-placed comment can explain how you got the number without the unnecessary overhead.We also cover how comments can clarify units like seconds versus milliseconds, why this thinking applies beyond config files, and how questioning small habits can improve your code overall.(00:00) - How many seconds is five minutes? (01:45) - The problem with inline config math (03:45) - Using comments instead of runtime calculations (05:30) - Why questioning habits improves code (07:00) - Silly bit Want a second set of eyes on your Laravel project?
Ep 144What could be worse than having no tests?
Found a cool package on Laravel News? But how do you know if it's actually worth installing?In the latest episode of the No Compromises podcast, we discuss what we look for when evaluating third-party packages before bringing them into a project.Aaron makes the case that what he finds in the tests folder is essentially a deal-breaker: no tests means no trust, but leaving default example tests behind is somehow even worse. Tests reveal whether the maintainer thought through edge cases and serve as living documentation when the README falls short.We also cover the other signals we weigh: GitHub stars, download counts, issue responsiveness, and how quickly maintainers keep up with new Laravel versions.(00:00) - Evaluating packages you stumble across (01:30) - Why leftover example tests frustrate Aaron (03:45) - Tests as documentation and edge case proof (05:00) - Checking issues and Laravel version history (08:00) - Silly bit Want to work with us on your project?
Ep 143Why I changed my mind about down migrations
Have you ever built a strong case for something, only to realize later you were solving the wrong problem?In the latest episode of the No Compromises podcast, we discuss Aaron's surprising reversal on down migrations, a topic we've publicly discussed on this podcast.We walk through the original arguments for writing down migrations and deconstruct each one.(00:00) - The original case for down migrations (03:45) - Aaron changes his stance (05:15) - Why seeders beat rollbacks for local dev (10:30) - Rethinking the production rollback scenario (14:45) - Silly bit Keep your knowledge fresh, check out Mastering Laravel.
Ep 142Why senior developers feel wrong more often
Ever catch yourself second-guessing decisions you were confident about just months ago? Does that mean you're getting worse at your job?In the latest episode of the No Compromises podcast, we explore why senior developers often feel "wrong" more frequently than they did earlier in their careers.Aaron makes the case that this isn't a sign of declining skill—it's evidence of a richer mental model that reveals nuance where things once seemed black and white.We discuss how feedback sources shift with experience, why changing your mind signals growth rather than failure, and how to reframe architectural decisions as a spectrum rather than binary choices.(00:00) - Feeling wrong more often as a senior dev (01:45) - Knowledge plateaus and how growth resets them (04:45) - How feedback sources change with experience (07:00) - Binary thinking versus nuanced decision-making (09:15) - Silly bit Want two Laravel experts to review your code?
Ep 141Should you ever hand-format code?
Ever feel like you're wasting your time tweaking a section of code to get it just right? We have tools for that, don't we? In the latest episode of the No Compromises podcast, we discuss when to trust auto-formatters and when to nudge code by hand. Aaron makes the case that a few mindful minutes of “prettying up” can unblock harder thinking, without surrendering judgment to tools. We set limits on this approach, share a tiered break strategy, and make it clear why you still own what the formatter changes.(00:00) - Auto-formatters vs subjective style choices (01:15) - Edge cases tools miss and human tweaks (03:15) - Using light formatting to unlock hard problems (05:15) - A tiered break strategy for focus (07:00) - Silly bit Want two Laravel experts to review your code?
Ep 140Discussing different ways to model data
It's easy to overcomplicate data modeling, especially when enums, relationships, and future requirements are in play. In the latest episode of the No Compromises podcast, Joel brings Aaron a real-world technical dilemma: how to model a relationship between two models when types are stored as enums, not models. We discuss the pros and cons of pivot tables versus JSON columns, the importance of context before jumping to solutions, and how developer instincts can sometimes get in the way of clarity.(00:00) - Setting up the technical problem (02:00) - Pivot tables vs JSON columns (05:15) - Filtering and validation considerations (07:15) - Deciding on the best approach (09:50) - Silly bit Would you like us to review your code or application architecture?
Ep 139Read outside tech to expand your horizons
It's easy to get so laser-focused on programming and tech, that you close yourself off to other avenues of learning.In the latest episode of the No Compromises podcast, Aaron argues that non-tech reading can sharpen your engineering thinking.We discuss balancing breadth without diluting focus, and how to turn casual reading into active learning with quick capture habits.(00:00) - An example from a book on business (03:30) - Don’t go too broad (05:15) - Practice active learning (07:15) - Read something different (07:30) - Silly bit You should still read our Laravel books though.
Ep 138Rewriting without a map: shipping an MVP from a legacy app
Multiple times we have encountered the messy reality of rebuilding a decade-old system: stale specs, missing specs, and stakeholders who want "the same… but better." In the latest episode of the No Compromises podcast, we share a lightweight framework for agreeing on an MVP, tagging "post-MVP" ideas, and negotiating trade-offs while still making progress.We walk through practical tactics for parallelizing work and learning as you go.(00:00) - Rebuilding an old system without copying its flaws (02:00) - Two extremes: too many specs or none at all (03:00) - MVP tension: ship value vs. future wishes (04:45) - Define MVP, capture unknowns as post-MVP tickets (05:30) - Build the first slice and learn (07:00) - Code foundations while refining scope (08:30) - Trade-offs as collaboration, not confrontation (09:30) - Takeaway: progress, check-ins, iterate together (10:00) - Silly bit Want to join one of our community dev calls?
Ep 137A composable, versioned toolkit for Laravel projects
We join a fair number of projects, and we often help teams bring their project up to our standard. This means bringing a lot of the same small pieces from project to project.In the latest episode of the No Compromises podcast, we rethink our “project standard” repo. Instead of a full Laravel skeleton, we propose a composable library of tool-specific, versioned configs (PHPUnit, Docker, etc.). We walk through the benefits for greenfield and legacy work, open questions about test organization, and how this approach scales as tools evolve.(00:00) - Why we keep our tooling current (00:15) - The “project standard” repo is aging (01:30) - Reference guide vs installable skeleton (02:30) - Supporting old and new stacks (versions, tags) (03:30) - Pivot: organize by tool and version, not app (04:30) - Example plan: folders for PHPUnit 11/12 (and beyond) (05:15) - What belongs where? Tests, traits, and context (10:00) - Docker-first thinking; where Horizon config lives (11:15) - Open questions: PHPUnit vs Pest vs “testing” folder (12:15) - Takeaway: evolve the repo as the tools evolve (12:45) - Silly bit Want help making your project as organized as one of our projects?
Ep 136Should you use DTOs in Laravel?
DTOs (Data Transfer Objects) aren't mentioned anywhere in the Laravel docs, but some devs use them heavily in their applications, whereas other devs never use them at all.In the latest episode of the No Compromises podcast, we weigh the pros and cons of DTOs in everyday Laravel apps, comparing them to form requests, PHPDoc-typed arrays, and service-layer boundaries, and share one area where DTOs truly shine. The takeaway: keep DTOs in the toolbox, but reach for them intentionally, not by habit.(00:00) - Framing DTOs in a stricter PHP world (01:15) - Our current practice: hybrids, few true DTOs (02:45) - Form requests, `safe()`, and typed inputs (03:45) - Reuse across API and form layers rarely aligns (04:30) - Where DTOs shine: normalizing multiple APIs (05:45) - Service boundaries: wrapping vendor objects (e.g., Stripe) (06:15) - PHPDoc-typed arrays vs DTO overhead (06:45) - Conventions, Larastan levels, and avoiding ceremony (07:45) - Treat DTOs as a tool, not a rule (09:15) - Silly bit Want to discuss how we can help you with an architecture review?
Ep 135Sunsetting a company app without loose ends
Business change and projects end, but how do you wrap up and sunset an app, especially one you've worked on for years?In the latest episode of the No Compromises podcast, we share a practical checklist for winding down an app when the whole company is closing. From documenting services and dependencies to deciding what data to retain, we cover backups, credentials, and why deleting local copies matters for security and sanity.(00:00) - Sunsetting a company vs project handoff (02:15) - First goals: stop charges, purge data (03:45) - Document before shutting anything off (04:15) - Use README/PRODUCTION.md and password manager (05:45) - Decide on retaining code, DB, uploads (07:15) - Hunt secrets in .gitignore and dotfiles (09:15) - Delete local containers and repos by default (11:30) - Silly bit Want peace of mind that your project is ready for whatever happens in the future. Schedule a call with us today.