Episode 238 | August 5th, 2025
Hello and welcome to the Modernize or Die podcast.
It is August 5th, 2025.
This is episode 238.
My name is Eric Peterson and I'm joined today by Grant Copley.
How are doing, Grant?
doing good.
How are you doing?
I'm doing pretty well.
It's crazy to think we're in August already.
I know and if you have kids they're probably starting school.
So my daughter just started her school today so summer is ending.
It's true.
My kids got two more weeks left and we're both counting down for different reasons.
Well, hope your summer has gone well, all of you out there listening, and thanks for
joining us today.
We want to start by thanking our sponsor, Ortus Solutions, and tell you a little bit about
a upcoming workshop that we have.
So this episode is sponsored by CBWire, which is the one of the fastest ways to build
reactive modern UIs without leaving your CFML server.
So as many you probably know, I'm the lead on CBWire.
So it felt appropriate for me to tell you about it this morning.
But you can forget about front-end frameworks and endless JavaScript.
CBWire tries to simplify all that for you.
And if you're interested in it, we've got a two day CBWIRE workshop that's going to be
right after Adobe CF Summit 2025.
So it will be led by yours truly and Luis Majano And if you attend, it is a two day
workshop and you get a hands on experience and we're going to do a deep dive into anything
and everything CBWIRE.
So we'd love for you to attend that September 24th and 25th in Las Vegas.
Awesome, that sounds like a great time
I'm looking forward to it.
Well, let's jump into some news.
Let's tell you about some BoxLang things this week.
We'll start with a community post from Ray Camden about simple charting with BoxLang.
I actually really liked his opening here.
If you pull it open, he says, building a BoxLang app and want to know how to do charting
with it.
The answer is simple.
Don't.
uh Which you might be sitting there thinking, wait, what?
But the idea is charting for the most part is a front end concern and your users are going
to want interactive charts that they can hover and click around and drill down.
And you just can't do that without going into JavaScript.
So just use JavaScript.
Now, if you're sitting there thinking, but I want to like print this, I want to generate
it in a PDF, I would point you to tools like WKHTML to PDF, which is a mouthful.
but it's a open source tool to basically run your web page and take a PDF screenshot of it
for lack of a better word.
There's even a Forgebox module out there made by the Inleak group that works with a Docker
container so you can easily make those PDFs.
then it goes through, you know, here's how you provide data to the chart and initialize
that JavaScript.
And, um, I believe there is a CF chart, sorry, a BoxLang chart library slated for
development when somebody that is a
paying subscriber wants it.
So until then, keep your life simple.
I know one of my previous jobs, we loved high charts was the charting library we used.
And it could do a ton of stuff.
You know, once you got the data, you know, like, here's a map of things and you can click
on it and drill down to the countries and then the countries you can see numbers and heat
maps on the map and like it's
Yeah, so there's lots of.
issue nowadays is there's so many to out there, it's trying to figure out which one to go
with.
It's true.
And it also depends on your budget, Like, high charts is not free.
Chart.js is, I think, what Ray was using, which is really great for a fully open source
and free chart library.
I mean, start there if you need something.
And then look at other ones if you need that.
great little blog post there about charting and BoxLang.
We had a couple of releases as well.
BoxLang 1.4 is out and it is being billed as the biggest release yet.
I'm guessing that means biggest release since 1.0, since I think 1.0, the whole language,
is a pretty big release.
Yeah, I think that's fair to say.
But yeah, this is a big one.
So just look, we're going to post the link here, but just some of the highlights from the
release, new async primitives.
So things like async run, async all, async any, all kinds of asynchronous goodness they've
put into this release.
There's been some improvements with mini server.
So I see here environment variables, health checks.
Additional security protections looks like there's a lot of changes there Performance
improvements with strings and JSON and custom component lookups tons of bug fixes.
Actually, I've got hundreds of bug fixes here don't know if that's literally but there
might Okay Yeah, and then it looks like new documentation which I yeah, I know that
they've been uh
pretty busy with that stuff.
everything from the mini server to transactions and all that good stuff.
So yeah, really big release and I'm excited to check it out.
I think my favorite here has to be the async stuff.
Having dealt with it across multiple engines now, you appreciate the power that BoxLang
hands you.
It's very simple when that's all you need, and then you can dive into basically the whole
power of Java completable features underneath when you need it.
So that's great.
And we also had one more release in a BoxLang module, the BoxLang JSoup module.
JSoup is a library, a Java library used to parse HTML.
You can use it to grab data out that you need.
You can use it to clean HTML if you're, you know, accepting user content and you need to
make sure to sanitize that.
You could do a lot with, even with pipelines, I've seen things transforming.
HTML into structured JSON, which is pretty crazy.
All built in, huge power of BoxLang is how easy it is to tap into Java and even easier
when you install a module that gets that jar for you and gives you a couple of built-in
functions to start dealing with Jsoup documents.
So if you're in BoxLang, this probably supplants the...
Is it cbjsoup on ForgeBox?
There's one.
I don't know.
I made one, I thought.
Maybe I used somebody else's.
Let's see.
No, I must have used somebody else's.
Don't tell me.
Eric, that you had really done all of the modules that are in existence.
You've done a bunch.
I have.
I used Jsoup way back in the way to make a integrated testing library where you could
basically say, visit this page, type this, type that, press this button.
Kind of like you would think like Cypress or Playwright tests, but it was all...
just static HTML.
wasn't running a browser.
wasn't clicking.
It was using Jsoup to basically say, make sure this form field exists that he said type
into store this data, get ready to send it off.
like, it hasn't seen updates since, I don't know, 2020.
Like, it probably works, but yeah, I tend to use, I tend to need JavaScript support
nowadays.
So playwrights kind of my thing for that, but.
JSoup was very good on that and there is a coldbox JSoup module.
Don Bellamy wrapped that up.
So if you're not on BoxLang, CBJSoup and if you're on BoxLang, BXJSoup.
All right, should we talk about some CFML updates?
I grabbed one out when I was looking today.
I saw a question on the community forum and posted an answer, so I figured I'd bring it
up.
It was about handling custom JWT claims in CB Security.
So cbSecurity has built in JWT support, JSON web tokens, and claims in those tokens is
basically any data that you want to put in.
And when you decode the token, you can see that data.
A JSON web token, for those that haven't used it, is just a serialized JSON object that
includes a signature so you can verify that it hasn't been tampered with and that you can
trust that data.
and you can put anything you want in those custom claims.
And this person was asking how to do that in CB security.
So I was pointing out there are two main ways.
One is your subject that's being logged in or that's having the token created for it has
two methods that will be called on it.
There's a get JWT custom claims and get JWT scopes.
So that custom claims is a perfect place to take the structure passes you add anything
else you want and send it back.
So if your claims are per user, that's a perfect place.
And then when you are logging in, the attempt and the from user methods both accept custom
claims being passed in.
For one client, we use that to like look at a remember me token.
And if it's checked, we up the timeout, right?
We pass it a higher timeout that gets merged in.
So those are two ways that you can.
Adjust the custom claims based on where you need in your application.
Very nice.
All right.
And we also have an update from Ben Nadel.
We've got a blog on explicit arguments, always override argument collection.
So I did not know this, and I do this all the time.
I use argument collection.
So if you don't know, when you are passing arguments to a function in CFML, you can...
pass them all, you can do them individually or you can do it all at once in this argument
called argument collection.
And apparently there's a little more to it than that according to Ben's blog post.
So you can not only pass argument collection and then pass in a series of arguments, but
then in addition to that, you can actually pass additional arguments that end up
overriding what you're sending in argument collection.
So.
This is one of those things, you know, as long as I've been doing this, I don't think I've
ever had an instance where I was trying to pass in something other than just argument
collection, because I didn't know that you could.
I just always assumed that it was just, you had to put everything in argument collection.
So anyway, it's been uh blogged on that.
We'll post the link here.
So I thought that was kind of interesting.
Yeah, I mean, it was kind of like a weird spread operator, right?
In JavaScript, where you can, depending on if you put the keys before or after they get
overridden.
But in this case, explicit keys always overwrite argument collection.
So, yeah, I'm with you.
I did it.
see if that's consistent across the CFML engines, but I'm assuming it is.
question Ben usually puts in a couple but in this case
He only has a screenshot from Adobe?
Yeah, that's a good question.
Yeah, I think I'm going to keep doing what I do, which is build up that argument
collection struct beforehand and handle overrides in the order I want so I can remember
why it's happening.
but yeah.
Also from Ben this last few weeks was creating runtime extensions and polyfills in
ColdFusion.
I think this is a very classic.
Ben posts where he goes through kind of setting up a framework so that you can inject
these methods in a clean and also bounded way so they don't become like global and
polluting your variable scope or anything like that.
So he goes through a few and like putting in a system output or dump polyfill right you
can use those in
BoxLang in Lucee, but not in Adobe.
And so there's a way to add that.
It reminded me a lot of things that Wirebox does with its runtime mixins or even
ColdFusion has, not ColdFusion, sorry, ColdBox has application helpers or view helpers
that you can register and get put in every file.
It's interesting.
Part of the reason that he wanted to go through this was, I guess his work has a global
function E, just the letter E as an alias for encode for HTML.
he was fresh.
Maybe I don't know for us, he's the right word, but saying like, how do you know what that
is?
They seem mysterious.
They seem surprising.
And this whole lot.
exercise was how to make that more explicit so you know where all these are coming from.
And I think that's one thing I like about Coldbox is at first it kind of feels mysterious,
but once you learn here's where the framework grabs all those functions from and if I add
a function here it now appears like it becomes less mysterious.
it in all your we're all creating a framework and there's always some some learning curve
to get up to speed on that.
And until then, some things just seem like magic.
But once you understand the magic, then you can extend it and augment it for your own
needs.
Yeah, for sure.
All right, shall we talk about some events that are coming up?
All right, so in case you missed it, build a Boxlang app webinar with Raymond Camden.
We'll post the link there.
So if you didn't get a chance to see that, go check it out.
And I think there's going to be a few of these because this is listed as part one of
three.
part two and three supposedly coming to you soon, but, not in August because August we
have a different webinar.
We have leveling up your async game with BoxLang presented by Jon Clausen This is going to
be August 20th at 11 AM central time.
It is free.
You can register at Eventbrite.
and we'll put the link to the blog post in the show notes.
Yeah, so I'm assuming he's going to be covering all the all the async goodies that just
came out.
That and I know there's a lot that came up before like John specifically worked on the
virtual thread support Which is Normal Java threads and so anything async worked on Actual
platform threads right like how many threads your computer had access to and you can
saturate those Virtual threads is I want to run this Asynchronously, it doesn't need its
own dedicated platform thread.
It can share them
And so you can now have hundreds of threads, virtual threads running without, you know,
bogging down the JVM and causing performance issues.
So he worked on that part.
You can access virtual threads in BoxLang.
So I'm sure that's going to be part of it as well.
So that's going to be one not to miss, especially if you're like, I haven't really gotten
into the async stuff.
Like it can change your code dramatically and the tools in BoxLang make it so easy to use
without some of the normal headaches that the other CFML engines tend to have.
We also have Adobe Confusion Summit 2025 coming up.
We talked about it briefly, September 22nd and 23rd.
There is a certification available on either the 21st or 24th.
Tickets are still available at CFSummit.AdobeEvents.com.
If you are doing the certification, you're going to want to go on the 21st before the
conference.
So that way you're available for the Ortus training afterwards on the 24th and 25th that
we talked about.
That's that CBWire Workshop led by Grant here and Luis.
Make sure to grab tickets to that.
It's going to be great and you'll have a wonderful week of CF and BoxLang learning.
Yeah.
So, and I really enjoy, you know, we did the workshop at end of the box and loved it.
The only thing, the only downside to it was trying to fit everything into one day.
And I'm pretty excited that this is going to be a two day workshop because it's really
going to give us time to, to, really dig into it.
So we've got that and then already, I can't believe this, Into the box 2026 is now out.
Our call for speakers is open.
So if you are interested in being a speaker, we would love to hear from you.
Can't wait to see what awesome BoxLang stuff comes out.
It's like we opened this entirely new avenue of creativity.
It's not just cold box and other box goodness, it's BoxLang
Yeah, and being able to extend the language and yeah, it's going to be interesting.
em That is April 29th through May 1st is into the box.
There will be some workshops before then as well.
The call for speakers is open until November 15th.
So you've got some time.
Go ahead and submit those topics.
We're very excited to see what you come up with.
Speaking of Into the Box, the video series for Into the Box 2025 is live on CFCasts for
all attendees.
If you are just a CFCasts subscriber or not a subscriber and you want access to this, can
purchase it at a premium right now.
CFCasts subscribers will be getting access later this year on November 1st.
And Patreons also have free access for their, as a token of appreciation for their ongoing
support.
If you are in any of the groups that should have free access and don't, please drop us a
line so we could get you all set up on
Additionally, we have some YouTube links and a blog post that will take you to the CF Camp
slides and recordings that Ortus was in charge of that would include a few sessions there
as well as the keynote for, I think, day two, one of the days.
So lots to catch up on if you've missed some of these events.
Better than just come to them in person next year, right?
Get your tickets now.
Day one keynote.
I was wrong.
Day one keynote.
Awesome.
All right.
We got through this one pretty quick.
We we don't want to waste any of your time today.
Other days we'll waste your time, but not today.
Well, we definitely don't want to leave without giving a huge thanks to our Patreon
supporters.
So these are individuals that are personally supporting our open source initiatives to
support things like Command Box, Forge Box, Cold Box, Content Box, all the boxes and help
us do continued development on those.
So your contributions fund our cloud infrastructure for the community, things like Forge
Box and package management with Command Box.
And we're going to post a link where you can, if you're interested in being a Patreon, you
can join us and we have annual memberships.
You pay for the year and you can save 10%.
It's great for businesses.
And I think we've got different packages.
We've got like a bronze package and up bronze packages and up now get a Forgebox Pro and
CFCasts subscription with your Patreon subscription.
All Patreon supporters, get a profile badge on the community website and private forum
access on the community website and then also a private channel in our Box Team Slack,
which we are always active on, always on the Slack.
And so thank you again to all of our Patreons for supporting what we do.
And I think we are up to 61 now, is what I'm seeing.
So yeah, thank you guys.
And thank you everyone for tuning in.
Thank you to our live viewers and thank you to you listening wherever you listen to your
fine podcasts.
We'll be catching you again in two weeks.
We'll see you then.
Bye everyone.
Join our newsletter
Switch to Modernize or Die ® Podcast - SoapBox Edition - Switch to Modernize or Die ® Podcast - Conference Edition
Music from this podcast used under Royalty Free license from SoundDotCom and BlueTreeAudio
© 2019 Ortus Solutions