All Episodes

June 26, 2025 47 mins

In this episode, Jake and Michael discuss the nuance of being “busy”, saying no to features (and why), handling user feedback early, Laravel-powered static views with dynamic data, and building tools that stand the test of time.

Mark as Played
Transcript

Episode Transcript

Available transcripts are automatically generated. Complete accuracy is not guaranteed.
(00:00):
Hi. I'm Michael Dyrynda.
And I'm Jake Bennett.
And welcome to episode 178 of the NorthMeets South Web Podcast. [rock music]
Nailed it. Good job, dude. How's it going?
Nice. Going well. Going, uh, yeah. Goingwell.
-Busy--Good
-... but but well. How about you?-Great. Yeah. No. Same. Same. I [sighs]

(00:20):
I've tried recently.
I I catch myself saying the same answerthat you just gave a lot, which is busy,
-right?-Mm-hmm.
And and i- it's true. Like, it's not alie. I mean, we are. We are busy.
-We're all busy.-But I realized after a while that I would
ask people the same question, they wouldsay the same thing. And it's like, you
know what? We're all busy. All of us,we're all busy.
-Yeah.-Like, so-
All busy all the time.

(00:40):
Yeah. I tried to stop saying that, but itdoesn't work very well 'cause it's still
typically my answer. "How are thingsgoing?"
-Yeah.-"Oh, you know, bus- pretty busy. But busy
work, but the good. Things are good.Things are good." You know, so whatever.
-So--I mean, I don't, I don't know how else to
-answer the question because that's--I know.
-That's how I am.-There's so many things going on. It's like
-I have to pick one thing to talk about.-Mm-hmm.
Uh, it's like I I could talk about a lotof things, but there's a lot of things
-going on, so I'm busy.-Yeah.

(01:00):
-There's a lot, you know?-Yeah.
-We all are.-Busy.
-We all--Busy, busy
... are.
You reach that certain stage in life whereyou, you think... Uh, I remember thinking
when our kids were little, like, "Man,once my kids can feed themselves and tie
their own shoes, then things will probablyslow down." And it's like and then they
get older, and it's like then it'sfriends-
-Gets harder-... and sports.
-Yeah.-And you're like, "Man, after basketball
season is over, then then things are gonnaslow down a little bit." And it doesn't.

(01:24):
-It just keeps going faster--Yeah
-... and faster and faster and faster.-We're we're just moving into that phase
-now with Eli playing sport and soccer.-Mm-hmm.
-And now it's--Mm-hmm
Liv has decided that she doesn't alwayswant to... I think more often than not,
she doesn't want to go to the soccergames, which is fair enough-
-Mm-hmm-... 'cause it's cold-
-Yes-... and she's sitting around and she's
-bored. And--Sure. Yeah. Yeah

(01:45):
... she's not really interested in it. Sobecause she's not participating, she
doesn't doesn't really wanna be involved.And so one week, I'll take Eli to soccer.
-One week, Ria will take him. And so--Oh, nice. There you go
... it's back and forth, and then, like,figuring out who's going where. And and
now that the kids are a little bit moreindependent and it's a bit easier to do
things. Like, before, when we'd, like,bath the kids, we want all hands on deck

(02:06):
'cause someone will be washing one,someone will be drying the other one,
-getting them ready for bed--Yep.
-And all that kind of stuff.-Yep. [laughs]
Now
now both of them can basically washthemselves, except when it comes time to
washing their hair. And Eli can dresshimself, so it's like you... Uh, we just
watch them get in and out to make surethat they don't-
-Get in there-... slip on the bath.
-Yep. Yep.-You know, so that makes it easier to,

(02:27):
like, go out during the week so that, youknow, Mum can put one of them to bed or I
-can put one of them to bed, feed them--Yeah
... all that kind of stuff. And and it'snot like this overwhelming chore of of
having to do all of that stuff becausethey're quite independent
already. Um, and so that that makes life alot easier, so that we don't have to have
two people here all the time. It makes iteasier for for Rhea to go to the gym or

(02:50):
for me to go out and and grab a bite orsomething like that, so-
-Yeah. Yeah. Very true.-It's just a-
-That is true.-But it's a different kind of busy, as you
-say.-It is different.
-You know?-Yeah. That's right.
-It's just phases--Yep
... of busy. And then, you know, once theyget to-
-Exactly-... the age of your kids, at at the other
end, it's, like, more professional sportkind of commitments. Not not professional,
-but, like, higher level of of sport--Yeah
... commitments, where

(03:11):
it's training multiple times a week. It'splaying multiple times a week. It's all of
-this kind of moving around--Right. Right
-... where we now--They're trying to get better. Like, when
they're younger, it's like they're justtrying to play. They just, they're happy
-to just play.-Yeah. Mm-hmm.
And, like, at this level, they have tokinda decide if they wanna be... If this
-is what they wanna do, if they don't.-Yeah.
And if they do, it's like they've gottacommit to practicing outside of the
-practices and games and stuff.-Yeah. That's right. Yeah.

(03:32):
And so it's like if you actually wanna getplaying time and be good, you gotta do
stuff outside.
-Mm-hmm.-So coordinating those times as well and
-whatever. So...-Yeah.
It's all lots of fun, man. It is all lotsof fun.
-It's good though.-But those, for like, for Graham right now,
he's 14, so it feels like the clock isstarting.
-Mm-hmm.-The countdown is on. You know what I mean?
-It's kinda--The countdown to college because it's very
-different for--Give as much time as we can with him
-... for you guys over there. Mm-hmm.-Yeah.

(03:53):
-'Cause what's--Yep.
Over there, very, very common for, youknow, um, kids to to pack up and go off to
-college and not--Yep. Yep
-... not stay at home and--Totally
... and be away for for months at a timebetween breaks and things like that.
Whereas here, they, they, generally,people will still go to university
where they grew up.

(04:14):
-Mm-hmm.-And and it's like you'll catch a bus to
the city to, like, go, and then you'llcome back home at the end of the day. So
it's it's very different, you know,hearing those perspectives. I see Abigail,
you know, tweeting about it, that they'rethey're running out of summers with the
kids at home and the kids being around andall that kind of stuff. And it's just not
something that really
crosses our... my mind because

(04:34):
short of going to the
join the army, you know, like my my nephewdid, you don't really... Like, most
people kind of tend to stay where they areuntil they finish study. Not a lot of
people will travel interstate for study.Um, I think that's fairly uncommon here.
-Interesting. Yeah.-Yeah.
-Yeah. That is a cultural thing.-Or is this, like-
-I think--... part of the course for you guys?
I think... Very, very common. Yeah.Exactly.

(04:56):
-Mm-hmm.-And a lot of kids see it as their first
opportunity to sort of escape theirhometown. You know what I mean? It's like
-they wanna get outta here.-Mm-hmm.
They wanna go experience the world, livesomewhere different, live apart from their
parents and family. Kinda have their theirleap into adulthood, if you will. So-
-Yeah-... which comes with the pros and cons,
you know, because they're only 18, sothey're still kids, man.
-Yeah.-It's like-
-Yeah.-... you can make really stupid decisions
as 18-year-olds. You can make reallystupid decisions as a 40-year-old too.

(05:17):
-But--Yeah
... got a little bit more life experiencebehind you. So, anyway, yeah. It's, uh,
it's fun, man. It's, it's been a goodstart to the summer, and
things are going good.
Um,
last show, when we were talking, um, wecame up with, like, a bunch of things that
we wanted to talk about, and so I wrotethem down. And we talked about how we

(05:40):
wanted to sort of have a little bitmore... What did you call it? Like, not
-consistency, but, like--Continuity.
-Continuity. That's it.-Yeah.
That's the word. Continuity between theshows. And so last time, we were talking
about
Wistia, talked about the new Wilber Jobswebsite and how-
-Mm-hmm-... that w- that was pretty cool. Um, I've
got a couple things we could talk aboutwith that. Staggered CSS animations, live

(06:04):
photos, we could talk about that. Or wecould talk about where to store values for
templates in static sites. That's aninteresting one.
-Mm-hmm.-Or defensive programming.... or time
bombed feature flags. All right, which onesounds the most interesting to you?
Hmm. Time bomb feature flags I've playedwith in the past, and they've bitten me-

(06:24):
-Yes-... because they don't, they don't work-
-Ooh-... quite as, quite the way that I thought
they would.
All right, let's dive in. Let's dive intotime bomb feature flags. Okay.
-Should I set the stage real quick?-Mm-hmm.
You wanna tell me what Pennant is? Tellus, tell all the people what Pennant is.
Pennant is a Laravel first partyimplementation for f- feature flagging,
uh, in, in your Laravel apps, right? SoTim McDonald-

(06:47):
-Yeah-... built, built that one out, hmm, not
last year, the year before, I think. Soit's a couple of, couple of years-
-Yeah-... it's been around now. And, yeah, it's
a, it's a first, first party, you know,it, it feels like a Laravel implementation
of feature flags.
Yeah, it's, um, it's a really good,
um, it's a really good library, and it'svery simple. Um, so it's,

(07:10):
you know, it's basically the minimumamount of code that you would need in
order to be able to run feature flags iskinda how I think of it. So
it's really, um,
wonderfully simple. Uh, the couple ofthings that we, the way that we use it is
you have...
You can either have a closure
that helps to give it a name. You can namethe feature and then have a function that

(07:35):
accepts a scope and then resolves thetruthiness of that feature.
So
you say, let's say, um, the feature is,
I don't know,
Ken Call Michael. It's Ken Call Michael.The, you know, one of our support people
gets a emergency button on theirdashboard, which if they need help, they

(07:57):
can call Michael. And only certain peopleget access to this because, you know,
there's people who have abused this in thepast. And so we wanna start out with only
giving it to managers, because managersare the ones who, uh, can escalate calls
to Michael. So what we're gonna do iswe're going to thi- name this feature Ken
Call Michael, and, uh, the way that I'mgoing to do it is I'm going to implement
it inside of a class called Ken CallMichael Feature. And, um, inside of that,

(08:21):
I have a resolve function, or sorry,resolve method, which accepts a scope, and
I think typically that's just a generic,it's mixed $scope. But you can specify
things like user. So I know that I'mpassing a user into that scope, and it
will fail if I pass anything else. So I'llpass a user in as that scope, and then I
can say user hasRole manager, somethinglike that. And I return that, return the

(08:46):
truthiness of that statement. So if thatstatement returns as true, when that
person visits the page that, uh, checksthat feature, right, where that feature is
actually on the page, it will grab thatclass. It will resolve that feature,
resolve that method, and then it willreturn a truthy or falsey, um, value. And
then that will get stored. Depending onwhat driver you're using for Pennant,

(09:09):
it'll either get stored in the database,or it'll get stored, you know, in Redis or
other places, wherever you might have it.
-Mm-hmm.-And then at that point, it is resolved. It
is not stored. It will not ever resolveagain unless you delete or, or, uh, purge
that feature for that person, which isgreat.
So that's the idea, right? I can turnfeatures on or off. I can also launch it
as, like, nobody gets it. I can just, fromthat resolve function, return false. And

(09:32):
then I can go into the database, and I cansay only I get it, right? Or I can
release it to a beta group of users. So Ican test it in production without having
any fear of breakages occurring becausenobody can see it except for me. So if it
breaks, it's only gonna break for me, orit's gonna break for a very small group of
users. So really, really nice. Now,
after having explained that, Michael, Iwant to hear your idea or explanation of

(09:56):
time bombs,
why you might use them, and how youimplemented them and how they bit you.
Mm-hmm.
Yeah. Well, I think it's, it's the, thefact that they are resolved once and
persisted that has bitten me because-
-Mm-hmm-... the, the time bomb nature is that I
would expect that a feature flag appliesor doesn't apply depending on how you've

(10:18):
got your code wrapped by that feature flagat some point in the future.
-Mm-hmm.-So the way that I wanted to use them,
rightly or wrongly, last year when, when Ilooked at it, was to time bomb the
-display of speakers for Laricon AU.-Hmm.
So, like, on some day in the future, wewant this speaker to appear on the
-website.-Yeah, yeah.
So I don't have to remember to do it. So Idon't have to be at the computer to, you

(10:41):
know, tick a box or whatever. So Ithought, yes, I will, I will time bomb
that feature flag,
uh, so that that speaker appears at somepoint in the future.
Now, the problem with that was, becausethat was resolved once, when it resolved
-the first time that it was loaded--Mm-hmm.
-It was false-... it was like... It was false. So it
went into the database, and that was it.It was just false forever. So I would have

(11:03):
to then go in, [laughs] on that time, onthat day, to then remove that flag, which-
Yeah
-... kind of defeated the purpose of it.-Defeats the purpose.
-So that's--Totally.
That's where, that's where I got bitten bythem. Other than that-
-So--... I think they work fantastic.
Okay. So, so
it's probably helpful to talk aboutdefinitions of what a time bomb is. So

(11:26):
what you've explained there is notnecessarily a time bomb. A time bomb, as
Martin Fowler describes it when he'stalking about features and toggling, is a
way for you to make sure that featureflags don't stick around for forever,
-right?-Mm-hmm.
So you could think of a time bomb more asan expiration date than a... Only to show

(11:50):
-it at this time. Now--Mm-hmm
... I think it's worth discussing how wewould actually approach your particular
-problem that you're talking about.-Mm-hmm.
And
maybe,
I don't know. I- I'm actually not sure howI would solve that with Pennant. I think
I would honestly, in that instance, Iwould literally just put a
timestamp check or something [laughs] likethat.

(12:11):
-Yeah. All right.-I would wrap it with a conditional if that
-says--Yeah
... if, if, uh, now is passed and thenpass in the date-
-Mm-hmm. Yeah-... and then I would... Then that's how I
-would do that probably.-... yeah, this year. This year, we put all
of the, the speakers into the database,so now we just have a, like, publish date
-is in the past.-Ah, so- oh, perfect
-That works fine this time-... there you go.
Yeah. Which is the sensible way of doingit, but last year, we kind of... The, it

(12:33):
was all static HTML really, so we, we putall the spon- uh, the, all the speakers on
-the page that way. And so we're--Yeah
... just expecting, like, for each one tothen,
t-to, to appear effectively when, when thetime is in the past, but didn't work out
that way. Uh, but this year, yeah. It'sjust a, just a field on the database
that's an announced at or something likethat, and we just return all of the

(12:54):
speakers where announced at is less thanor equal to now, which is much-
-That makes sense-... easier way of doing it.
-Great way to do that-Don't use feature flags for that. Yeah,
-no.-Absolutely. Great way to do that. So,
so if we're approaching this idea of timebombs as this, as more of, like, an
expiration date, um, I, I would love totalk about that just for a little bit.
And, and essentially, I'll give you thescenario that

(13:15):
we faced that had me looking back intothis, which was we had a feature flag that
was,
you know, gate, gating a feature that wehad written
and I pushed it out on a Friday
-and promptly forgot.-It's time to push down
-About that feature.-Yeah. Just want to push down
Totally forgot about it. It didn't matter.It was like, "Okay, hey, whatever." So,

(13:37):
uh, I enabled it for a couple users and
the users of us who had it just
looked at it and figured, "Well, everybodymust have this," right? We totally forgot
-that we did not release it for everyone.-Yeah.
And so six months later, somebody's like,"Yeah, I don't know how to see, like, if
this file is timed up or not." Like, well,just use the, you know, just use the

(13:58):
-timed up, you know, thing at the top.-Yeah.
They're like, "I've never seen that." Andthey're like, "Well, like, certainly.
Like, it's right up here. Here's where youshould see it." Go into the features
table. Yup, not enabled for anybody exceptfor us. Like, ah, crap. And so what
happened is
we had this feature flag that was notsupposed to be around forever. It was only

(14:18):
supposed to be for this beta testing sortof idea. And once it was good, then we
needed to remove it. So the question is,how do you inform yourself when
you should, you know, how do you basicallyput an expiration date and say, "Hey, by
the time a month has passed, we shouldhave figured out if we want this feature
-or not for everybody."-Mm-hmm.

(14:39):
It should be general release to everybody,or it shouldn't be.
-Yeah.-And, you know, we kinda need to pull the
trigger on one way or the other.
So I asked Tim McDonald. I was like, "Howwould you do this?" We had a couple ideas
for how we would do it, but the way thathe did it was very, uh, clever. And so I
wanted to share the idea that he had,which is,
uh, to put on each one of your featureclasses, which again, is the way that I

(15:04):
really prefer to do it, is to use aclass-based resolution because you get all
the other things you can do, thisbehavior, these traits that you can put on
it and whatnot. But you make a traitcalled is, like, concerned with
expiration, you know, maybe something likethat. And inside of there, um, you have a
contract essen- or sorry, maybe it's acontract, not a trait. But it's, uh, a
contract that specifies that you need tohave a

(15:25):
is expired
method that returns a Boolean.
And then what you can do is, uh, in thatis expired, you can do a date. You could
say now is past a particular time, or youcan do other things, right? You can,
there's other things you could do. Itdoesn't have to just be a date, but you
just return a Boolean from there.
And then what you can do
is

(15:46):
you can, in your service provider, you cansay there's an event that says feature
resolved, I think is what it is. So whatthis does is any time that a feature gets
resolved, even if it's out of thedatabase, if it's grabbing it,
it will look and say,
um, is this an instance of,
you know, or does this extend the contractor implement the contract of, uh,

(16:10):
you know, can expire or something,whatever. Like, what, you know, I'm using
bad names here, but that's the idea,right?
-Sure. Yeah, yeah, yeah.-And if it is, if it does extend that
contract or implement that contract, thenwhat you do is you check to see is it
-expired.-Yeah.
And if it is expired, then you can do acouple things. So, um,
you know, you could log, warn yourself,something like that. Um, but the thing

(16:32):
that Tim did, which I thought was reallycool, is there's this way that you can
check to see if you're running testscurrently. Have you ever seen this before?
-So it's like--The other container that's, like, is
-running--Yeah
... running unit tests or something likethat.
Yeah. If app dot op running unit tests. Soyou can do this conditional. You should
say, "If we're running tests

(16:54):
and it's expired,
then we want to throw a runtime exceptionthat says feature has expired." So what
that does then is if you're ever running atest that encounters this feature, and
the feature is expired, it's going toforce you to make a decision one way or
-the other.-Yeah.
-You either need to extend--Extend it

(17:14):
... the amount of time that you have untilit expires.
-Or remove it. Mm-hmm.-Or get rid of it. And I love that because
it does... It's not destructive. Itdoesn't ever mess you up in production.
Uh, you can have it log if it's inproduction if you want.
-Mm-hmm.-Instead of throwing that runtime
exception. Um, but it's a great way toensure that any of your features that
you're putting in place have a reasonableexpira- uh, expiration timestamp on them

(17:38):
and that you're forced to deal with themat some point in the future.
-Um, so I thought that was pretty cool.-I like that.
-Yeah.-That is a very Tim thing to do. [laughs]
Mm-hmm.
To put a thing in there. I've,
-I've--So he wa- so he did... So here's the deal.
He hasn't actually, like, this is not...
This does not exist. You have to just addit on yourself.

(17:58):
-Yeah.-Right?
-Yeah, exactly. Yeah.-That's why I was like, "It would be cool
if it was first party." He's like, "Imean,
I didn't feel like there was a good..." Hesaid, "I didn't feel like there was a
good generic option to put on top of it."So-
-Yeah-... I built the tools. A lot of the users
to decide how they wanna handle it, butit's not, it's not difficult to implement
-it.-Yeah.
-Right? You could see how you would do so.-Yeah. It demonstrates a lot of restraint
on, on his part and on, I suppose, onLaravel's part in general about where you

(18:22):
draw the line in the sand for, for whatyou do offer as part of the library and
for what you say, "The tools are there. Goand implement it."And, and I think this
is, this is a fairly good
case, use case of the tools that go andimplement it yourself. I've, I've gone
back and forth over the years aboutwhether or not

(18:44):
using those kind of conditionals inapplication code is a good idea or a bad
-idea, you know?-Mm-hmm.
Doing an, like an environment check ordoing a, are we running unit tests? Or, or
that kinda stuff to then trigger thingsbecause you're, you're putting
test logic inside of your application codeto do this kind of stuff.

(19:05):
Erm,
I think it's fine, in general. I don't, Idon't really see any reason to do that. I
know that in parallel testing and thingslike that, we will have all kinds of
conditionals that check, like, if theparallel testing token is set, then we
need to go and do this stuff. And thensomewhere else we go, "Okay, don't do this
stuff because we are parallel testing,"and, and things like that. So

(19:25):
there's definitely cases, I think, where
doing that kind of runtime, testing timelogic is good. I think
forcing you to, you know, blow up your...[sighs] It depends on how strict you are
on your continuous integration. Like, ifyou're running this in CI and it fails
because somewhere between where you pusheda pull request

(19:47):
-into GitHub and some--Mm-hmm.
And, and when the CI ran, your, your testsuite is now failing
because of this expired token or thisexpired check,
but it's unrelated to the pull request
that, that was pushed up. So I think
that's, like,
that's the one thing that, that sticks tome. It's like, okay, yes, we need to do

(20:09):
something about it. It is now impacting onthis unrelated thing,
and it's, you know, a team decision. Whatdo you do with that? Is someone now tasked
with going immediately and, and updatingthat? Do we... You know, it, it may not be
a decision that gets resolved straightaway, depending on the size of the
organization. It, it might be, like, youas a developer or as a founder, you can go
like, "Yeah, I'll just kick that can downthe road a week," or, "I'll go and remove

(20:33):
all of those feature flags, and this isnow just a feature that's part of the
platform." So yes, it does prompt you todo that, but sometimes that decision
-involves committees. It involves--Yeah
... product teams, product managers,things like that. You've gotta go ask.
You've gotta go wait. They don't have ananswer. They've gotta go chase it up with
-someone else.-So now you have a blocked PR, yeah.
And meanwhile you've got a blocked PR anda failing test suite, and all of that
-kinda stuff. So, you know--In fact, every PR is blocked, right? If

(20:57):
you had multiple PRs out there, all ofthem are blocked.
-Mm-hmm. Yeah.-And every single person is trying to
scramble to figure out what do we need todo with this.
Yeah, yeah. And everyone's going, "Oh,this is failing. Retry fail tests." Like,
'cause they're like, "Oh, this wasn'tsupposed to fail," you know? Es-
especially, like, we get into situationsat work where the, the test suite will
just be flaky.
Erm,
and it's just over time, the, theconstruct of, of the application has

(21:20):
changed where, you know, you've gotfactories that, that are resolved in a
certain way. Which is okay when you've got100 tests, but when you've got 500 tests
or 1,000 tests, those factories can, like,step on each other. You might not have
something that's unique, so
over
enough iterations, you end up withcollisions and things because you don't
have the, like, fake, faker Unique appliedin there. So there's, like, all these

(21:43):
different
cascading
arbitrary failures that you might not evenlook at it for a couple of days-
-Yep-... until someone goes, "Hey, this is,
this is failing." So
I like the idea in
theory.
-Mm-hmm.-I think
whether or not it works depends on
the kind of company that you're in and howquickly they respond to that. Like, if

(22:04):
you,
and, like, whether you put that in thereat all,
uh, really comes down to how quicklysomeone is going to respond
when... It may be a case that you log,
you know, for two weeks or somethingbefore the failure,
erm, even if you are running in test sothat something bubbles up somewhere that
hopefully someone would see.

(22:24):
Erm,
but yeah.
-That's a l--Yeah, you're, you're-
... long-winded way of saying that, like,I think in general, I agree with the idea.
I like, I like the idea of puttingsomething [laughs] that explodes in, in
test. Because that's something that
at some point in your release cycle,whether it's during development locally or
as part of CI or deployments, like,something will blow up because of that.
-Yeah.-Erm, and, and what you have in place to

(22:47):
work around it. You know, okay, we canjust merge this PR anyway knowing that
this is,
erm,
-unrelated to that pull request.-Yeah.
If you do, if you do automated deploys,it's a bit trickier. Erm,
it depends on, like, if you do... I knowwith, erm, Laravel's testing stuff, you
-can --fail on your test.-Mm-hmm, mm-hmm.
And, like, it will f- after the firstfail- like, if that's the first failure

(23:10):
and it doesn't get to something else-
-There's just stuff there.-Yeah. Yeah, okay, so this is unrelated to,
to my failure. I'm gonna, you know, shipthis anyway. Oh, whoops. There was a, some
error further down in the test suite thatdidn't get picked up 'cause we bailed out
on this thing. So...
-Yeah.-You know?
-I'll say that the--Rest reward, I guess.
Yeah. The,
the concerns that you bring up are the s-very same concerns that Andy Hinkle had

(23:33):
when we were going to implement this. Hewas like, "I don't like the fact that
other developers are gonna have to dealwith a feature flag before they can merge
their stuff." So we came up with someideas and some solutions. The one thing I
will say too, though, is that this, I feellike, follows the convention that has
been brought about in many
different... You know, like we talkedabout Nuno's, um, thing where it's, like,

(23:54):
just here's the best practices applied tothe app service provider.
-Mm-hmm.-Where it's like, disallow n+1 queries or
disallow lazy loading or, you know, thoseassignment overflow things or whatever.
Like, those, those sorts of things thatonly fail if you're in local, if you're in
your local environment. You know what I'mtalking about?
-Yeah. Yeah, yeah.-So, like, it'll check those things. It's
not gonna blow up in production. It's notgonna blow up in your face. If you happen

(24:15):
to ship it to production, it's gonna belike, "Eh, okay. Just let it go." But if
you're in local dev or in testing, it'sgonna blow up in your face and say like,
"Yeah, you can't do that." You, you can't-
-Mm-hmm-... you know, do that lazy load stuff. So
this sort of falls in line with that tome. Um...However, it's not a
yes or a no, or an always or a never.It's, it's only based on some time-based

(24:39):
thing a lot of times, which is... So it'snot a right or wrong. It's just like if
you happen to be the guy who runs it justbefore it expires, or right after it
expires, then you're screwed. You're theone who has to deal with it. So
okay, so how do we address this? Well,
two couple... Two, two different ways Ithink we could deal with it. Um, one is
that you could, if you're running,

(25:00):
uh, your CI on a regular enough basis, youcould start dropping warnings a month in
advance of the expiration, right? So youcould say, "If it expires in the next 30
days, throw a warning on the tests. If itexpires in the next..." You know, if it's,
if it's in the past, then go ahead andthrow a failure. You know, something like

(25:20):
that. So that would allow you to benotified of it ahead of it actually
expiring, so that you could fix it. Um,and like, you know, you see it, it's, it's
erroring, or not erroring but it'sthrowing a warning, and you're like, "Oh,
okay. I should probably make an issue forthat so somebody can fix that or make a
decision." We have 30 days to do so. Theother thing that we talked about is making
a command that runs once a day at like6:00 AM, something like that, that runs

(25:44):
through the features, checks if any ofthem are expired and if they are, sends
off an email or sends it or creates anissue, or whatever you might have that
says, "Hey by the way, these features areexpiring within the next 30 days or the
next 7 days," or whatever. Uh, or they areexpired and these need to be addressed,
and that's it. You know, so there was...That was, there was a couple options
there. You could say it doesn't ever failtests, it just sends out a warning to let

(26:09):
somebody know that this needs to beaddressed. Um, so there's a couple
different ways you could do that therethat I could see being effective that
would not necessarily block the team, butcould inform a project manager that these
are something that we need to prioritizewithin the next cycle.
Kind of, you know, deprecation warnings Iguess for features.
Yes, exactly that.
-Mm-hmm.-Yes, correct. Yep, yep.
Yeah, and I think realistically that's theonly way to, to deal with it. And if, if

(26:33):
no one's gonna pick up the deprecationwarnings
for the feature flags like that
on a, you know, across a team, across anorganization, you know, if you're
involving all these different p-
all these different people, then
probably have bigger concerns to, to worryabout. You know, at least sending that
email or that notification in Dislike orwhatever else

(26:54):
that happens to be from that scheduledjob, scheduled task, is...
You know, you've got to address it in someway. Um, and if it goes to enough people,
someone... Well actually, if it goes totoo many people everyone's gonna be like,
"I thought someone else was gonna dealwith it," and then you've got to be
-careful there as well.-Yeah.
So
yeah, keep the, keep the list small butmake sure it gets actioned, I guess is the

(27:14):
-main thing.-Exactly.
But again, comes down to the team and,like, someone actually taking ownership o-
over that. So
-yeah.-Yep.
-Good, uh--Yep, you got it.
Good, good problem. Um, I think good, goodsolution to that problem as well.
Awesome. Yeah, thanks. I, it was, it was afun one to kind of run down and it was...
Uh, yeah. A couple different approachesthere, a couple different concerns, but I

(27:36):
was happy with where we landed on it, soyeah. Stoked about that.
-Mm-hmm.-Okay. Since you talked about your, um,
your speakers on Laracon, um, I think thisis a good transition into this other part
which is this,
where do you store values
for
templates in a static

(27:58):
view? Okay, so let me pitch it to you thisway. Let's say you didn't have a database
for those team members, or not anotherteam members, for those speakers, right?
Um, because locally you are going to do itand you don't want to have to like... How
do you, how do you populate your databaselocally and then push that up to

(28:19):
production without having to have accessto the production database? You can't
really do that. It's like I know what thevalues need to be, they're not necessarily
dynamic, it's just I- I don't... Where doI store them, right? Do I... What are my
options? If I, if I can't put them in adatabase, where are the other places that
I could put them? So I actually came upwith one just as we were talking here, but
there was a couple options here that,that were thought about, right?

(28:43):
One is you could literally just dre- like
create a component and then in Blade, just
you don't even bother doing a loop. Youjust put in the values.
-Yeah.-Right? That's it. Create a component, put
the values in, that is your databaseessentially, right? You just-
-Mm-hmm-... write them all out in the blade, and
that works. That's fine. Like you justbasically, your component is going to have

(29:06):
locations or values, like the values thatyou would normally store in the database
are gonna be essentially like arguments tothat component, right? So like name,
image source, um,
title, announcement date, right, all thosethings.
Right? Those are gonna be, those are gonnabe stored like in the Blade file.
-Yeah.-That's one way to put it.

(29:26):
-Yeah.-That's one spot to put it.
-Yeah.-Um, can you think of any other spots you
might, you might put these things?
I can because this is what we did lastyear was-
Ooh, okay. I wanna hear, I wanna hear. Iwant wrong answers only.
-We, uh--Wrong answers only.
-Wrong answers only [laughs]. Yeah.-Yes. What were the other places you could
-put it?-We created, we created a YAML file that we
-hosted in GitHub that you had to--Okay
... in a JS, it was a secret JS... No[laughs], I'm joking.

(29:48):
-I was gonna say, oh dang. Okay.-You said wrong answers only.
-That's crazy [laughs].-You said wrong answers only.
I- I, at first I thought you were beingserious. I was like wait a second, do you
really? Okay. All right, all right. A YAMLfile in-
-No, we--... a JS that you were pulling in R.
-In a JS.-Fair enough.
-That's right, yeah.-Yeah.
-So if anyone wants to go and--And then you used Sushi.
... uh, and scan. Sushi. Yeah, to use asan-
Used, uh, Caleb Porzio's Sushi package,yeah.
... eloquent database. That's right. Uh,no we just, I just put all that stuff

(30:09):
-inside of like a config Laracon.php.-Okay.
And it was just an array of speakers whichwas keyed by...
Actually, I don't think it was keyed. Ithink it was just an, an array that we
then pulled out and we, you know, wecollected it. We put it in a collection.
We sorted it by announced. We filteredones that were not, you know, didn't have
an announced in the, in the past and thatwas it. That's, that's how we did it.

(30:32):
-Yeah.-Um, and then I think w- we just used, you
know, Cloudflare to cache that so wedidn't... Well, you know, obviously the
page gets cached so it doesn't have to hitthe origin server to, to resolve that in
the future. So yeah, that was, that was itreally.
Yeah. Uh, that works pretty good. So,like, you could put it in the config. You
also, if you're being a little bit crazy,you could just chuck it into the
-controller. Like, if you wanted to--Mm-hmm. Yeah

(30:52):
... just inline an array in thecontroller, you-
-Yeah. Sure-... could kinda put it in there. Uh,
that's one way to do it as well. Um, so,uh, my,
my junior-ish developer, he's actually...He's Landon. Landon is his name. Um, he
played basketball a little bit last yearat Laracon with me right afterwards. There
was a couple dudes that we all played.Me, David, Hemphill, Landon, and then

(31:12):
three other dudes that absolutely smokedus. It was really fun, but kinda crazy.
-[laughs]-Landon's a great basketball player, junior
developer though, and he's, he's figuringstuff out. And so for him, he ini- or
initially just put it, like, in thecontroller. Like, he actually had
a method for each. Like, so we had, like,four locations that we were trying to,
like, you know, deal with. And so what hedid is he put,

(31:35):
uh, a method in, in the controller.
So you would have, like, a, a value beingpassed into the controller, um,
like, uh, you know, in the, like, thearray that gets passed in to the, to the
-view. I'm sorry, to the view.-Yep. Mm-hmm.
And he would say, like, "Location one, FatArrow,
this.get('location1')." And then say,"Location two-"

(31:56):
-Yep.-"... this.FatArrow.get('location2')." So
he was just calling private methods insidethe controller that were sort of then
-returning these arrays. And I was like--Yep
..." Hmm,
that is fin-" Like, it works. It'sprobably not how I would do it, but it
-works. And so I--Yeah
... was like, "I'm wondering..." You know,config file is the first thing that came
to mind. But for some reason, I rememberwhen looking at it, there were some
reasons why it wouldn't have really workedin a config file. And I think partly

(32:19):
because he was doing some PHP stuff insideof that config file, and, like, it
would've been weird to do it there. Um,
but
the other thing that I'm wondering here isthis. If you didn't want to store it in a
config, what if you just put it in aSQLite database and then shipped the
-database up?-Yeah. Yeah,
-totally.-If you put that in somewhere? Like, could
you... Where would you put that, though?Would you... You'd put it in the storage

(32:41):
file or something? I don't know how thattypically works. If you put it in the
storage, you have to, like, symlink it orsomething weird like that if you're using
-Envoyer.-Yeah. I would just, just put it in the
database, 'cause that's, that's where theSQL files go by default.
-If--Okay
... you know, if you, if you, if you do aLaravel new and you say you wanna use
SQLite, it will create adatabase/database.sqlite file inside of
storage. Uh, inside of the databasefolder, and then you just commit that to

(33:04):
-version control and off you go.-Yeah, 'cause I'm... As, I'm sure initially
it's probably.gitignored maybe?
Hmm, not a... Oh, yeah, maybedatabase.sqlite specifically, but you
-could just remove it from there, like--Totally. You could.
Just because Laravel puts it there bydefault doesn't mean you can't change it.
-Um--Absolutely.
Yeah. Yeah, shipping, shipping sqlite isfine. Um, who, who was it? Like, was it
Aaron Francis was talking about that for,

(33:26):
for, um...
I think for his aaronfrancis.com. He's, heships an sqlite file or something like
-that, so.-It seems like the right place to do it,
-right? I mean, like--[laughs]
... you literally have, you have thestructure in there. You can pull it using
-your, uh, you know, using models and--Mm-hmm
-... all that good stuff.-And, you know-
So it's like, I don't really see a reasonwhy you wouldn't or why you couldn't.
SQLite is, is made to be small andportable like that.

(33:47):
-Every, you know--Mm-hmm
-... the, these things, every--I mean, the problem is it can fill up
-... everyone's iPhones--It's just a flat file, yeah.
Everyone's Android file. Yeah, it's just,just shove it all in there. Yeah.
-Yeah.-Um-
-Yeah, so I think--I mean, the other thing you could probably
-do is like a--... that's, that's an interesting third
-option. Yeah-... a document store. You know, something
that writes JSON to a file, and
-do that, I guess, with, like--Yeah, but the SQLite thing seems way
better to me. Yeah, as long as you have...I mean, as long as you can set up... You

(34:08):
know, you just have to make sure thatevery person, each person that's looking
at it,
uh, when they're trying to develop stuff,uh, that they map... Uh, you know, they
can open TablePlus to that sqlite file orwhatever, right? So-
Yeah. Yep.
Yeah, that seems like a good way to do itthough. Seems like a pretty good way to do
it. Um, portable, light. It's still a mi-it's still a, uh, you know, queryable

(34:29):
-entity. Um, you don't have to write--You could be-
You don't have to write, like, factoriesor anything for it. You could just... You
know, you just ship it. You ship theactual data up.
-Yeah.-Yeah.
You could open up TablePlus and use thatas your, you know-
-Totally-... as your admin interface-
-Yeah-... to put stuff in there.The only-
-Absolutely, and you've got--... the only other thing that, th-
... version control on and everything, youknow?
Yeah, yeah. I mean, the only other thingthat you might do that's probably a little

(34:50):
bit more approachable in terms of versioncontrol is just a, like, a CSV file,
-and then use--Yeah
... Switchy to, to, to manage that.
-Yeah. But I like the--Because then-
-... SQLite. I like the SQLite option.-Yeah. The ISQL-
-And I, I'm not pushing that direction-... is definitely nicer from a, from a dev
perspective. If, if you needed, like,someone else,
you know, someone from product or someonefrom sales or marketing, whatever, to be

(35:11):
putting data in their CSV would be fine.And just like, "Here's the updated file."
Yeah.
-Yeah.-"Drop it in, overwrite, replace it." You
-know?-Yeah, it's only developers working on this
one, so I think SQLite's gonna be thesolution there. And I think that's, um,
that's a really great way to do that. So,uh, we're gonna move towards that,
actually. That's w- exactly what we'regonna do. We're gonna end up doing that
precisely.

(35:32):
Love it.
Love it. Awesome.
Okay, um, what else we have here?
Live photos, staggered CSS animation,defensive programming.
What do you think? Hmm.
So, uh, Matias...

(35:53):
I can't say his last name. Starts with aG. Guimaraes, I think. Uh, he's got a
defensive Laravel
course coming to Laracasts at some point,so it should be cool.
I saw Jeffrey tweeted about that, like,today, I think. Yeah.
Yeah. Yeah, he, um... De- definitely checkthat out if you're a Laracasts
subscriber. I, uh, I watched his...
-It was Event Sourcing Tour- uh, series--Mm, yes

(36:14):
... that he had on Screencast. That was,that was really good. He did a, a good job
of that, so I'm, uh, I'm keen to see
his, um,
his defensive Laravel stuff. Because he,he works at, like, a payment provider or
-something over, over there--Oh, interesting
... where he lives in,
pretty sure, Brazil.
-One of the--Okay
... Portuguese slash and/orSpanish-speaking nations. Sorry, Matias.

(36:36):
-But, uh, yeah, he, um--That's right, that's Portuguese, right?
-Yeah. I--Yeah, he's a-
Did I tell you about that, right? When Isaid-
-Yeah, yeah-... when I thought
But I couldn't remember if he was fromSpain or from Brazil. But I know in
-Brazil--Oh, gotcha
-... they speak Portuguese. Yeah. So--Yes, indeed.
Um,
yeah, he...So, he does some very intensethings, uh, in terms of, like, the
extremes of what you can do with Laravel,so I can't... You know, he'd be a, he'd be

(36:59):
a... You'd be hard-pressed to find abetter teacher for that kind of Laravel at
scale type of thing. So, yeah, keen tocheck-
-Yeah-... that one out when it drops.
That'll be really good. I'm sure he'llhave some excellent sort of tips on using
Laravel tools in order to be sure that youcan catch things if they happen terribly,
if they happen to go terribly wrong.

(37:21):
We had something today where,
um,
it was, it was the sequence in whichsomething was working, so we were reading
an email from an email inbox,
we were creating a record for it, and onthat database we had a unique column for
the ID of that item from that inbox. Sothat item from that inbox was given a

(37:45):
unique, like, Outlook message ID.
And so it's, you know, it's a GUID. And soit's, it's unique. You cannot create
another one with that same GUID.
However, the step after we created it wasto move it from that location, that
folder, to another location.
If that failed,
right? So you'd move it from the inbox toa folder called Processing or something

(38:06):
like that, right? So we create the record,and then we start to process that email.
We read the body. We read the subject. Wedo some, you know,
guessing as to where we think it needs togo and basically have our own really
intelligent rule system that we can buildup off of that database record, right? So
you create the record, and then you sendit to processing. Well, if that sending to
processing fails for some reason, whichsometimes is this weird race, race

(38:29):
condition, if it fails, then the emaildoesn't move, and when the inbox gets
scanned in the next minute, it tries topick that up again and create the record.
Well, since you have a unique ID, itfails. So
yeah. It, it's like just using simplethings like a database transaction around
those two pieces, right? Create it, andthen move it. And if it fails while

(38:51):
moving, roll back the creation so that itcan try it again next time without hitting
a unique constraint. So those are thesorts of things that we're talking about
here, right? These, you can't anticipateeverything that's going to happen. You
don't know all the different failurepoints, but you can certainly wrap
something into database transaction androll back if something fails. You can do
that. And that's, you don't have to knoweverything. You just have to know if

(39:13):
anything fails in here, roll back. Don'tleave this unfinished, weird state, um,
that you're gonna have to contend withlater, especially if you have-
-Yeah-... constraints around unique values. So I
hope in, in, you know, in his course he,he covers some of those things or, you
know, like the rescue function in Laravelis so insanely awesome. Where if there is
a failure while you're attempting to dosomething, you can provide a default

(39:35):
return value and just continue the programrunning as if nothing failed, right?
Those, that's incredibly helpful. SoLaravel has a ton of tools to help make it
more resilient and more bulletproof ifyou know they exist. So I'm sure he'll-
-Yeah-... cover all that stuff and do a great
-job doing so.-Yeah. One, one thing I've been caught out
with by that Rescue helper in the past istypically I'm wrapping something in Rescue

(39:58):
because I don't wanna know about it, andI always-
-Yeah-... I, I have on more than one occasion
forgotten to set the report flag to, tofalse.
Uh-huh.
So I still, I still get the exception tobubble up, and then I go like, "What is
this?" And then I, I, like, I put theRescue in there, and I go, "Ah, I forgot,
forgot the, to report." Because the, theplace that we mainly use it is when we are
trying to parse dates using Carbon orthe-

(40:19):
-Oh-... or the date facade. Because, you know,
you guys use, um, month, day, year, andwe use day, month, year.
-But--Ah, yes. Right
... if you take something that'sday/month/year
and you throw that at date parse, becausethat's how we would re-enter it into a UI.
Yeah.
When you take day/month/year and put itinto PHP, PHP assumes that it is

(40:43):
-month/day/year.-Yeah.
And so what you end up with is somethingthat's, like, 13/3/25.
-Yeah.-And then Carbon goes, "Thanks."
Freaks out.
Um, so yeah. We, we've got in a number ofplaces where we're handling that, you
know, a date create from format, and thenwe explicitly tell it, like, "This is
-day/month/year." So that--Yeah

(41:05):
... it goes, "All right. Yeah, this is,this is the right way round." Um,
and then we fall back to just doing, like,a date pass in case something comes
through as year-month-day or whatever elseand then, then gets picked up that way.
But yeah. When it, when it hits that firstRescue, uh, callable
and you don't have the report, then westill get the exception bubble up into,

(41:26):
um, our observability tooling. And it'slike, "Oh, yep. I don't really care about
-that," because--Yeah
... it's, it's... Like, it will, it willcatch the exception from the Rescue,
report it, and then go to the f- thefallback, so you're, like-
-Then it'll continue on, but yeah-But, and then you go, "But this worked.
Why am I...? Oh, okay. Yep. Gotcha."
-So don't, uh--Yeah, exactly
-... don't miss that one. [laughs]-I'm surprised that there's no, like,

(41:47):
localization thing for Carbon where youcan basically just tell it at the top
level, "Hey, we're in Australia. Pleasehandle dates accordingly."
Yeah, yeah.
Probably. Probably is and we just miss it,but, um-
-Yeah. Maybe-... no, 'cause this is an underlying PHP
thing as well.
-Like--Oh, gotcha
... if you were to do... Yeah, if you wereto do, like, a create, whatever the
underlying
PHP function is, it will do the samething.

(42:10):
-Got it.-The, the-
-Yeah-... the correct approach for that is to
-use hyphens instead of slashes.-Ah, interesting.
But no one, no one here is going to enterthe dates with hyphens instead of slashes,
-because that's just not what we do, so.-Yeah.
-Like, that is--Yeah
-... I mean, I assume that's--We don't, we don't do hyphens either.
Yeah. I assume that's, like, theworkaround in, at the language level. To

(42:31):
be like, "Oh, yeah, you can do this aslong..." But you, you're not gonna tell,
you know, users of your platform who have
become accustomed to using slashes to usehyphens in your application wherever else
-it's just handled, so.-Yeah.
Yeah.
Absolutely.
Well, hey, dude. I think we have a couplethings left to talk about next time. Um,

(42:53):
we could probably talk a little bit moreabout defensive programming and some
examples that we have. We could talkabout...... staggered CSS animations,
which is
interesting to me. This is when you goonto a page and you want, like, this
effect of when you hit a certainobservability point, and there's a, what's
that called?
Interaction observer? It will animatesomething in into view.

(43:17):
But if you have, like, three paragraphs oftext or something like that right
following each other and you scroll downreally fast, you don't want that whole
block to animate and at the same time. Youwant them to animate in, like, a
-PowerPoint--One after, yeah
-... like, one, two, three. Yeah.-Mm-hmm.
Which is a little bit tricky to do. Andso, um, I think, uh, motion.dev allows you

(43:37):
to do that. We figured out how to dothat. I still have to implement it. Uh,
and then this idea of how do we, how do weaccomplish live photos on the web, where
if you roll over something, it kind ofmoves the photo. It kind of gives you this
motion, where it changes from a photo toa video while you're rolled over it, and
-then--Yeah
... and then when you roll off it, it, itstops doing that.

(43:58):
-Interesting.-So found some interesting stuff about
that. It'd be, uh, I'd love to kind oftalk that through with you and see what
-your thoughts are--Mm-hmm
... on that. So
-next show, folks. Come on back and--Sure
... um,
you know, hey, uh, to go along with the,uh, the news of, uh, Steve and Erin
breaking up, I, I gotta let you guys knowthat, um, Michael said he's leaving the

(44:18):
podcast, and it's, he's just leaving it tome. He said, he said he's giving me
-everything. Just take it.-[laughs]
I'm paying, I'm paying him 50% of whatit's worth.
-So [laughs]--50% on anything is nothing.
-Since we haven't had a sponsor.-[laughs] Sorry.
-[laughs]-We are, we-
-Since we haven't had a sponsor in, like--[laughs]
... years, I'm getting a steal on thisthing.
-That's right. I said, I said to Aaron--Oh, man

(44:40):
... that, uh, that the, the unsponsorable,the unsponsorable comment was ruthless.
It was fair, but it was ruthless. [laughs]
-Oh, so funny. So funny. Oh, my.-He'll be fine.
-Well, anyway.-I think, I think he's for himself.
Yeah, I agree. I agree. No, totally,totally. He'll do great. And I think Steve
will do well too. I mean, I think peopleknowing that he's available, I mean, heck,
when I heard that he was available, I'mlike, "Oh, geez. I have a couple things I

(45:02):
could have him do actually." Like,actually-
-I said how--... one specific thing that I thought of
that I was like, "I would love for Steveto do this," but I knew he wouldn't have
-time.-Yeah.
-So maybe now he does.-Maybe. Get into it. 'Cause I said, "How
long before he'll... How, how long beforehe lands on the Lara ship?" So...
-[laughs] Right.-Get him before it's too late.
May- Who knows? Maybe that was, uh, maybethat was part of his, his calculation.

(45:23):
Maybe he was like, "You know what?
I can have a job over here if I reallywanted one."
-Mm-hmm.-"So maybe I'll just do the job thing for a
-bit." Who knows?-Yeah.
Not making any, uh, assumptions here. Hey,folks, also if you have not bought your
Laracon tickets yet, it's might be toolate. But if it's not, you should
definitely go buy them because Michael andI would love to see you there. We're
gonna doing some interviews there. We'regonna be enjoying the show, watching all

(45:45):
the talks, and we would love for you tosay hi. So please stop by and say hey.
Look for, uh, the really tall guy and lookfor the handsome Australian with the, uh,
other cursing Australian next to him.That will be Aaron. Uh, OG, OG Aaron.
-[laughs]-OG Aaron.
[laughs] OG Aaron making an appearanceagain at Laracon US.

(46:08):
-Yeah.-He's gonna be a riot. I can't wait to see
him.
Fun.
-It'll be good fun.-Awesome.
Episode 178, folks. Thanks for tuning in.You can find us at North Meets
South.audio/178. Hit us up on X or onBlueSky at Jacob Bennett, at Michael
Dorando, or at North South Audio. And, uh,if you liked the show, rate it up in your
podcast app of choice. Five stars wouldbe amazing. Thanks, folks. If you'd like

(46:28):
to sponsor us,
also talk to us on those channels. Itwon't happen. But if you'd like to, we'd
love for you to. But until next time,we'll see you.
Oh.
Advertise With Us

Popular Podcasts

Crime Junkie

Crime Junkie

Does hearing about a true crime case always leave you scouring the internet for the truth behind the story? Dive into your next mystery with Crime Junkie. Every Monday, join your host Ashley Flowers as she unravels all the details of infamous and underreported true crime cases with her best friend Brit Prawat. From cold cases to missing persons and heroes in our community who seek justice, Crime Junkie is your destination for theories and stories you won’t hear anywhere else. Whether you're a seasoned true crime enthusiast or new to the genre, you'll find yourself on the edge of your seat awaiting a new episode every Monday. If you can never get enough true crime... Congratulations, you’ve found your people. Follow to join a community of Crime Junkies! Crime Junkie is presented by audiochuck Media Company.

24/7 News: The Latest

24/7 News: The Latest

The latest news in 4 minutes updated every hour, every day.

Stuff You Should Know

Stuff You Should Know

If you've ever wanted to know about champagne, satanism, the Stonewall Uprising, chaos theory, LSD, El Nino, true crime and Rosa Parks, then look no further. Josh and Chuck have you covered.

Music, radio and podcasts, all free. Listen online or download the iHeart App.

Connect

© 2025 iHeartMedia, Inc.