Skip to content
Artwork for No Compromises

No Compromises

Joel Clermont and Aaron Saray

Two seasoned salty programming veterans talk best practices based on years of working with Laravel SaaS teams.

Play
  • 21 episodes
  • fortnightly
  • Avg 12 min
  • English
Counted on this page — what you have heard stays on this device, so it is not something the list can be paged by.
  • #159
    August 15 · 11 min

    Which layer of caching does your slow app actually need?

    When someone says your app is slow and you need caching, do you actually know which layer of caching they are talking about? In the latest episode of the No Compromises podcast, we discuss the many different forms caching takes in a Laravel application and why reaching for the cache facade is not always the answer. We walk through caching from the outside in, starting with edge caching via Cloudflare, moving into Laravel's cache facade for third-party API calls, and all the way down to memoization with the Once helper for expensive in-request calculations. We also make the case that storing data in a database table can be a perfectly valid caching strategy, and that the right question to ask is not whether to cache but what kind of caching actually fits the problem. (00:17) - Why caching means different things to different people (02:04) - Edge caching with Cloudflare explained (05:33) - When a database table beats the cache facade (07:45) - Memoization with the Laravel Once helper (09:19) - Silly bit We have seen every caching mistake in the book. Our code review will find yours. Get practical Laravel tips like these delivered to your inbox every day by subscribing to our newsletter.

    • Transcript
    • Chapters
  • #158
    August 1 · 9 min

    Where do credentials end and configuration begin in your env file?

    Have you ever fixed a failing test by adding a variable to phpunit.xml and moved on, not thinking twice about whether that was actually the right call? In the latest episode of the No Compromises podcast, we discuss a real pull request disagreement about where environment variables belong and why it actually matters. We draw an important distinction between credentials and workflow configuration in your env file, and why that difference should determine exactly what goes into phpunit.xml and what stays out. We also get into why zeroing out API keys and hostnames in your test environment is not optional, and how a small oversight in one PR can quietly expose your tests to real third-party services. (00:00) - A real PR disagreement about phpunit.xml (01:07) - Credentials vs workflow config in your env file (03:17) - Why Aaron is glad his tests failed (04:49) - How to properly isolate third-party test keys (07:25) - Silly bit Come talk through decisions like these with developers who care in the No Compromises community.

    • Transcript
    • Chapters
  • #157
    July 18 · 15 min

    Running AI agents on your production server is the new FTP

    Have you ever let an AI agent run commands on your production server because you were stuck, telling yourself it would be fine? In the latest episode of the No Compromises podcast, we discuss why giving AI agents access to your production environment is as reckless as the bad old days of FTPing code straight to your server. We make the case that AI agents are non-deterministic and carry no responsibility, which makes them far more dangerous than a developer making a manual mistake on a live server. We also cover why you should never blindly run complex chained commands that an agent suggests, how to verify what your agent is actually doing, and why a little friction in your workflow is worth the safety it buys you. (00:00) - FTPing to production is still wrong in 2026 (01:50) - Running Tinker on production is no better (02:28) - AI agents on production servers is even worse (07:11) - How to verify what your agent is actually doing (move from 07:00) (11:03) - Silly bit Stop letting non-deterministic tools make deterministic mistakes in your codebase. Get a code review. Subscribe to our newsletter and get practical Laravel tips delivered to your inbox every day.

    • Transcript
    • Chapters
  • #156
    July 4 · 13 min

    Why having a human partner still beats relying on AI alone

    Have you ever been stuck on a problem and instinctively reached out to a real person instead of an AI, and found that was exactly the right call? In the latest episode of the No Compromises podcast, we discuss why human collaboration still matters in a world where AI seems to have all the answers. Aaron shares a late-night hardware crisis that a blog post from a real human solved, something AI never surfaced, and connects it to a bigger point about the value of having a trusted person to work through problems with in real time. We also get into why video calls beat text, why knowledge sharing still matters even when AI seems to know everything, and why pushing back on a partner often leads to better code than just agreeing. (00:00) - A thunderstorm almost killed the podcast (02:58) - Why Aaron called Joel instead of AI (06:16) - The value of a real human work partner (08:01) - Why video calls change everything (09:15) - Human knowledge sharing still beats AI (11:47) - Silly bit Come find your people in the No Compromises community.

    • Transcript
    • Chapters
  • #155
    June 20 · 13 min

    What is really inside the AI tools you blindly install

    When you install a package, you probably skip the source code. But what about the AI skills and CLAUDE.md files you are feeding directly into your agent? In the latest episode of the No Compromises podcast, we discuss whether developers are reading the AI skills they install and why it actually matters. We make the case that unread skills are riskier than unread packages because they quietly shape how your agent thinks and can introduce security vulnerabilities or opinions you would never have agreed to if you had just taken 10 minutes to read them. We also look at the flip side, where reading those skills can make you a better developer, expose you to approaches you did not know existed, and help you guide your agents more intentionally across every project. (00:00) - Do developers actually read package source code (02:19) - Why AI skills are riskier than packages (05:07) - Security risks hiding in unread skill files (09:30) - Reading skills as a learning opportunity (11:49) - Silly bit Want a second set of eyes on the tools and packages your team is trusting? Find out how our code review service can help

    • Transcript
    • Chapters
  • #154
    June 6 · 13 min

    How much logic is too much logic in a PHP enum

    Have you ever added a method to an enum and then wondered if you just turned it into something it was never meant to be? In the latest episode of the No Compromises podcast, we discuss where to draw the line when adding methods and logic to PHP enums. We trace the evolution from magic strings to constants to interfaces, and explain why enums were the missing piece PHP needed all along. We also cover when label methods and data structure helpers belong on an enum, why Eloquent queries cross a line, and how to avoid turning a simple enum into a bloated helper class. (00:00) - Why magic strings and constants fall short (01:43) - How PHP enums replaced interface constants (02:26) - What methods belong on an enum (06:58) - The rule for keeping enum methods focused (10:44) - Silly bit Join developers who think carefully about clean code decisions in the No Compromises community.

    • Transcript
    • Chapters
  • #153
    May 23 · 13 min

    Your codebase is not a museum for old code

    Have you ever opened a file to make a quick change, only to find dozens of lines of commented-out code making it nearly impossible to understand what's actually running? In the latest episode of the No Compromises podcast, we discuss why keeping dead code around is slowing your whole team down. We make the case that commented-out or unused code creates real confusion when searching a codebase, whether you are a new developer, a consultant, or even an AI agent trying to understand what is actually in use. We also cover why Git is all the safety net you need, how Git bisect can recover deleted code you thought you might need someday, and why the fear of deleting code is almost always unfounded. (00:00) - Why commented-out code slows everyone down (02:03) - How dead code creates false search results (05:10) - Dead code costs you more with AI agents too (05:55) - How Git bisect helps you recover deleted code (10:08) - When commenting out code is actually fine (11:45) - Silly bit Join the conversation and share how your team handles dead code in our No Compromises community

    • Transcript
    • Chapters
  • #152
    May 9 · 14 min

    Do you actually own the code you ship?

    When a tool hands you a working solution, how much do you really need to understand about why it works? In the latest episode of the No Compromises podcast, we discuss whether developers still care about understanding the code they ship, or whether that expectation is becoming a relic of the past. We explore why knowing the "why" behind a solution isn't just about curiosity. It's about having enough domain knowledge to ask better questions, push back on bad answers, and ultimately produce better work. We also walk through a real code review example involving a tricky Eloquent query, talk through the pressures that pull developers away from digging deeper, and consider what separates a line cook from a chef in how we approach our craft. (00:16) - Are developers losing the habit of asking why (02:16) - How AI changes the copy-paste-and-move-on cycle (05:25) - Learning by accident while reading the manual (06:24) - The Eloquent query neither of us could explain (12:16) - Silly bit Join a community of developers who still care about understanding the code they ship.

    • Transcript
    • Chapters
  • #151
    April 25 · 14 min

    Do you actually need a multi-tenancy package?

    Ever feel like a project requirement says "we need multi-tenancy," and you're not even sure what that means in your specific context? In the latest episode of the No Compromises podcast, we discuss how to evaluate multi-tenancy needs before committing to an architectural approach. We break down what multi-tenancy actually means, from separate databases to custom domains and per-tenant configuration, and why the real question isn't which package to use, but whether you need one at all. We also explore when hand-rolling a simple solution beats adopting a full package, what legal and compliance requirements can force your hand, and why this is one of those decisions that's genuinely hard to undo later. 00:00 Defining what multi-tenancy actually means 02:11 Different ways to structure multi-tenant systems 03:44 When separate databases are truly necessary 04:57 Questions to ask before choosing an approach 08:25 Package vs. rolling your own trade-offs 11:30 Silly bit If you want guidance on decisions like these, check out our code review service to get expert eyes on your architecture.

    • Transcript
    • Chapters
  • #150
    April 11 · 13 min

    Local 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 bit Our courses took the production hits so your app doesn't have to.

    • Transcript
    • Chapters
  • #149
    March 28 · 11 min

    When 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 this 01:15 Flagging the unclear pattern across components 03:54 The Mary UI toast flicker bug explained 05:45 Naming, documentation, and protecting the whole team 09:30 Silly bit

    • Transcript
  • #148
    March 14 · 12 min

    Are 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/community 00:00 Are we testing code or framework 02:00 Joel metric for framework-only tests 05:15 Bottom-up testing perspective by test type 07:36 Why validation rules still deserve tests 10:40 Silly bit

    • Transcript
    • Chapters
  • #147
    February 28 · 10 min

    Being 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.

    • Transcript
    • Chapters
  • #146
    February 14 · 9 min

    Three 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?

    • Transcript
    • Chapters
  • #145
    January 31 · 9 min

    Stop 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?

    • Transcript
    • Chapters
  • #144
    January 17 · 9 min

    What 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?

    • Transcript
    • Chapters
  • #143
    January 4 · 16 min

    Why 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.

    • Transcript
    • Chapters
  • #142
    Dec 20, 2025 · 10 min

    Why 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?

    • Transcript
    • Chapters
  • #141
    Dec 6, 2025 · 7 min

    Should 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?

    • Transcript
    • Chapters
  • #140
    Nov 22, 2025 · 11 min

    Discussing 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?

    • Transcript
    • Chapters
Showing 1–20 of 21 episodes