Introducing Fusion - write PHP inside Vue and React components with Aaron Francis
Introducing, I have a
name for you, Fusion.
Fusion is the library that I will be
introducing to you today.
It is a new
JavaScript and Laravel library.
And I know you're thinking, Aaron, we
have a first-party
JavaScript and Laravel library
called Inertia.
No longer third-party, first-party, yes.
This does not Fusion
does not abolish Inertia.
It fulfills Inertia.
So this is my vision for what if we took
Inertia way too far?
What if we just took it like five steps
beyond what is reasonable?
That is Fusion.
So Aaron, what a perfect intro.
I'm just curious.
Where did this come from?
You were just like, hey, you know, kind
of, you know, Inertia's fine.
I don't have enough to do.
I'm good.
But yeah, you know, I've
got 14 products, four kids.
Seven podcasts.
But I really want to make this new thing
and spend my life creating this app.
Yeah, that's a great question.
That is a great question.
Yeah, so it came from so, you know, my
co-founder, Steve, he is a he's a
JavaScript guy, like,
through and through.
He's a Vue guy, so he does fit in well in
the Laravel community
because we love Vue.js.
And he has picked up
Nuxt and really likes Nuxt.
And that's like their, you know, meta
framework, whatever a meta
framework actually is, that's
what their meta framework is.
And so Steve and I are working together
on all these projects.
We're building out the course platform.
We're building out all this stuff.
We're using Inertia because he's like,
hey, I'm super fast with Vue.
Livewire seems cool,
but like I'm a Vue guy.
I've never really written PHP in my life.
And I'm like, that's great.
We have Inertia.
We're so lucky in this community to have
these two super viable
front end-esque options.
So we'll use Inertia and Vue and Laravel.
It'll be totally fine.
So we're working on it.
And Steve is constantly like, hey, how do
I get data into this Vue template?
And I'm like, oh, well, you know, you go,
you define a route
and then you define what
your props are and
then you send them down.
And then on the front end, you got to
define your props and
then you can receive them.
And he's like, what?
Why am I doing all this crap?
And then, you know, his next question is
like, okay, how do I mark that a user has
finished a video?
It's like, you know, we're listening to
these video events and
we're going to fire off like
videos done, like market so
that they, the UI changes.
And I'm like, no problem.
You got to create a route.
You got to create a
handler on the back end.
You got to create a controller.
You got to write your own
fetch function or your Exios call.
And he's like, this is not
the way that it should be.
And so it's one of those things where
it's like, you don't
really know, you don't really
know the filth and the squalor that
you're living in until
your friend comes over.
And they're like, dude, you've got to
clean this place up.
And that's kind of, that's kind of how I
felt was Steve kept
saying stuff like, this should
be easier.
And I looked at it with fresh eyes and
was like, this should be easier.
What are we doing here?
And I had observed from the outside, the,
you know, the next JS
community with all of their
like, you know, React server components,
React server actions, all
of this stuff that I don't
fully know.
And I'm like, that is kind of nice that
you can kind of just
kind of compose across the
network boundary.
What would that look
like in Laravel and Vue?
And that's kind of the genesis of it all.
That's awesome.
So me, so I have never used inertia ever.
Wow.
I, the, I used Backbone JS way back in
the day and I hated it with marionette.
And then like, and then we use like one
of the really, really
first like versions of
Vue.
And then that was it.
I switched to
basically not doing anything.
Switched to the live wire.
And then I worked at, you know, with Ian
on a help spot, which
is kind of, I mean, it
was kind of old JavaScript, like jQuery
and the stuff before that.
And then for me, like live wire come
around and I'm like, Oh,
this is like life changing
back to JavaScript land.
Totally.
So I guess my first question to you is
like, if you're coming,
you know, you're a brand
new developer, you've never used inertia.
Is it still pretty easy to get started
with or do you still
need to kind of know, um,
sort of Vue or React or anything else?
Uh, JavaScript land.
Yeah.
So this is kind of my, my vision for this
is like pulling in JavaScript developers.
So there's like a certain subset of
people that will never
use JavaScript on the front
end.
Like I'm not, I'm not going to ever try
to convince them to do that.
And for those people, we have a great,
you know, first and a
half party offering with
live wire, which I think
people should continue to use.
What I am going after and what I think
fusion goes after is the
people that really, really,
really want to use a Vue or React front
end and are finding
themselves ending up on the
back end of those stacks and realizing,
well, shoot, there's a
lot more to do than just
like the front end and
then get over the network.
And once you get over the
network, what happens next?
How do I talk to my database?
How do I send an email?
And it's like, Hey, we
actually have an answer for that.
And so if you're going to use, if you're
going to use fusion, you
absolutely need to know
how to use one of
these front end frameworks.
I do think, um, that this lowers the bar
in terms of like what you
need to know about front
end, um, because it does
rely pretty heavily on inertia.
So you don't have to figure out like
client side routing and
all of this like state stuff.
You're like actually going to new pages.
And so a lot of state
related issues go away.
Um, and the goal, the goal is to make it,
um, approachable to people who are coming
from the JavaScript community and want to
start learning a little
bit more about Laravel
slash a little bit more about like
backend development.
Yeah.
Yeah.
The, so coming from like a front end
developer, what does a
front end developer typically
use, um, on the backend?
Is it just all sort
of node on the backend?
And, and so they've never had any
experience with, I guess,
Laravel or rails or anything.
Yeah.
I think that is, um, I think that is the
meaty middle of the
market is people will pick up
react and then quickly
pick up, you know, next JS.
And you know, I'm not terribly familiar
with next JS, but I do
understand, you know, parts
of it or, or they'll pick up remix, which
is, um, you know, the,
the one that got bought
by Shopify, um, Kent C
Dodds talks about remix a lot.
And those have, um, those have really
focused on starting at the
front end and working their
way back in terms of like the framework
development where Laravel obviously
started on the backend
and now has a fully
fleshed out front end story.
They are taking it the
opposite, uh, direction.
I think remix explicitly claims to be a
center stack framework.
Um, I've heard them say that a lot.
Um, these, you know, these meta
frameworks will also claim
to be full stack quite often.
And I think it is, um, it's led to a
little bit of confusion
when you say Laravel is full
stack and, uh, next JS is full stack.
And so I think we've seen a lot of the
discussion about Laravel go
to batteries included because,
um, Laravel has all of these things like
for goodness sakes, authentication, like
you can log in and next JS is like, you
could use any one of
these five different SAS tools
for your auth layer.
And it's like, no, that's
not really batteries included.
Like yes, you can run code on the
backend, but where
are all the components?
Where's my queue driver?
Where's my email?
Where's my auth?
Where's my everything else?
Um, and so I think what a lot of next JS
developers have found the position they
have found themselves
in is super solid on the
front with react and everything.
You cross over that network barrier, you
get to the backend and
then you're in like, uh,
you're in jazz.
It's just like, let's
just make it up as we go.
Grab this package, grab this ORM package
and try to get them all to work together.
And, and JavaScript developers claim, and
I have no reason to
doubt them that they love
that they just love the freedom and
flexibility of like, I'm
going to build my own stack.
That sounds exhausting to me.
And so I am hoping, and I think it is
true that there are, uh,
there's a subset of JavaScript
developers that will cross over that
network gap and then be
like, there's nothing here.
I just want something here.
And that's where fusion,
uh, can come into play.
Cause once you cross over, you have the
entire power of Laravel on the back.
Yeah.
That's, uh, it's so, it's so much
reminding me about like
VM versus PhpStorm or, you
know, Linux versus my Mac.
It's just like, I don't, I'm gonna say,
wait, I don't want to
mess with none of that.
I just want to, I just want to build an
app and hopefully make
money or publish it or
do something.
Yes.
Yes.
Yeah.
The people that like the people that
fiddle with their neovim
configs for like hours on
stream.
I'm, I look at them and I
think I'm glad you're happy.
I do not want to do that.
I never ever, ever, ever want to do that.
And that's just cause
we have different goals.
Like I want, like you, I want to build
something and publish it
and hopefully make money.
And then, you know, when
your case go play golf, right?
But like, I don't want to fiddle.
I don't want to fiddle.
I want to make.
And so, um, this, and this is my kind of
my perspective on
everything is like this IE
fusion will appeal to some people and it
won't appeal to a lot of people.
And I'm totally okay with that.
I'm just building it for the people that
like kind of operate like I do.
Yeah.
Are you, uh, mentally prepared for any
backlash on hacker
news and everywhere else?
The backlash on Reddit
was swift and severe.
Um, the Vue JS
subreddit did not appreciate it.
Even the Laravel subreddit
was like, this makes no sense.
Why are we going back to 2004?
Um, and I, it was, it was totally fine.
I mean, I think a lot of those comments
betrayed the fact that
they didn't watch the video,
which makes sense.
Um, or they watched it and didn't
understand what was happening.
I think many people thought we are going
back to like a PHP being
the templating language
for your front end.
And we're like mixing in Vue somehow.
Um, which is just,
it's just not the case.
Like you happen to be
writing PHP in a Vue file.
Um, but in the build process, we like, we
extract it and we
basically turn it into a
controller.
It's kind of like syntactic sugar over,
um, controllers and routes and views.
And you can just write it all in one
place and we'll do a
little bit of auto wiring to
get that state into your Vue template.
But it's not fundamentally the same as
like PHP in 2004, but
boy did they hate it.
And you know, it was nice.
I felt like, actually this
doesn't affect me at all.
You know, I'm somewhat a sensitive guy
and I normally am
like, feedback is sometimes
difficult in this.
I looked at it and I
was like, don't care.
Totally fine.
So that was, yeah, it was fine.
I didn't care.
That's great.
Um, and this brings up another question,
uh, when, which I know
this is kind of brand new
and you're probably the only one that's
actually using it right now.
Um, how are you going to like the best
way to structure
functions, you know, inside the
Vue file?
Like, yeah, what happens when it gets
just a bunch of stuff?
Um, do you have any solutions there?
Or have you any thoughts of that or?
Yeah, I have.
And that was one of the criticisms that
came up on Reddit that I
thought was well-founded.
It's like, this is going
to lead to massive files.
Um, and I'm sensitive to that.
And I think, um, my, like my principle on
that is that this, uh,
the block of PHP that
you write in your Vue file is basically a
controller, more or less.
It like defines what comes down and
defines what can be, you
know, received back from
the front end.
And so my opinion on this is that the
controller should be relatively thin.
And so if we have, you know, the concept
of publishing a podcast
and you got to call out
the transistor and you got to do some
FFmpeg and you got to do
some whatever, um, I think
that should be wrapped up
in some sort of, um, action.
So like publish podcast action.
And in your, um, in your PHP that you're
writing in fusion, you're
just basically receiving
input from the front end and then handing
it off to that action,
um, to do all of like
the hard work that, you know, requires
the container and all of the other stuff.
Um, and it basically ends up being a way
to route, um, from the
HTTP layer into the rest
of your application.
And so I think that's probably going to
be the, the blessed
path, which is like, Hey,
y'all don't do everything in this one,
like in the same way that
you wouldn't do everything
in a controller.
Don't do everything in your, um, your
fusion component here.
And I think, I think that
most people will get that.
Of course people will write, you know,
700 lines of PHP in a
fusion component and it's
going to be like, this is not ideal, but
I think, I think it'll
settle out pretty nicely.
True.
And I mean, I was just thinking about
this while you were talking about that.
One of the examples you showed was like
class based, uh, PHP in the file.
So in theory, if you do have a thousand
lines of PHP there, you
could, you know, if PHP
store, whatever has auto complete, you
can jump between your
methods and for sure, it
might not be too bad.
Yeah.
Totally.
Totally agree.
Thin controllers.
Uh, you know, get that
stuff away from all your files.
Yeah.
And all of the fusion stuff is resolved
out of the containers,
like all the method calls
and so like, if you want to inject, you
know, process podcast as
a class, you can totally
do that.
And so I've tried to make it such that
it's basically Laravel.
Um, it's basically a Laravel controller,
but with a little bit
of extra magic on top.
And so hopefully that's
where people will land on it.
Gotcha.
The next question I
have is what about testing?
Like are you going to be able to use pest
and PHP unit or can you
somehow test the compiled
file?
I don't know how that's going to work or
do you have thoughts?
Yeah.
Yeah.
No, I have, I have a lot of thoughts.
So as it, as it is being built, um, so
like one of the great
advantages I have over, um,
over traditional PHP is I am guaranteed
that there's going to be
a build step because if
you're using viewer react,
you have to have a build step.
And so I hook into that build step to do
all of the fusion stuff.
And at the end of the build step, what
you end up with is a
bunch of PHP classes, you
know, existing on your desk.
And so, um, from that perspective,
testing is the exact same
as it would be otherwise
provided you run your build
step before you run your tests.
And so that's a little bit different.
And there are some like niceties that I
can add around that to
ensure that the build step
has been run before you run like a fusion
test or something like that.
But then at the end, you're basically,
you can just hit an
end point and assert that
you get the right response back.
And it becomes basically like testing,
um, uh, an inertia app.
So if you want to test the backend, you
can hit the route and it
will give you the stuff
and you can assert about
Jason and stuff like that.
Um, and I can add some macros and stuff
to make that easier.
And then if you want to test the front
end, it's the same as
testing, uh, any JavaScript
heavy front end, you got to, you got to
pick some tool that
presumably opens it in the
browser and exercises that they are.
Gotcha gotcha.
Yeah.
I just find that interesting cause like,
you know, it, to me,
it sort of comes back to
like even like pastor PHP unit in, in
just a standard straight
level app with no JavaScript.
A lot of times you'll want to, you know,
reseed the database or,
you know, dump the database
before you even start
your, your, your test.
So it's kind of the same vibes, I guess.
Yep.
Totally.
And the stuff that gets written to disc,
um, contains no data contains.
So it's not like we're doing something at
build time that is,
you know, dependent on
local state or, and then
you ship it and it's wrong.
So it's like, we're basically just taking
your PHP code, mucking
around with it a little
bit and turning it into a controller.
And so that really simplifies the rest of
how do I deploy to production?
How do I test, um, the fact that we're
doing this weird thing
and turning it into a normal
thing and then you just test the normal
thing, which is quite nice.
Nice.
Nice.
And I assume it's going to work fine on
level cloud and pretty much any way.
Yep.
Yep.
Totally.
Nice.
Nice.
And all right.
So from your original talk, you said on
the roadmap you had
react is, is that going to
be ready for lunch?
No, not for Friday.
No, definitely not.
Definitely.
Definitely not.
Um, I already have, so there's a Slack
group that I started,
um, that has like basically
open source sponsors.
You can come join the Slack group and,
um, you might remember
Miguel, Pierre for deer.
I forget his last name, purple hair.
One time almost bought the
constitution and that guy.
Um, he, uh, he's very,
he's very good at react.
And there's another guy in there called
Nick who's also very
good at react and they're
already scheming about like, how do we,
how do we do this in react?
And so, you know, I was supposed to
release it on Monday,
got out over my skis as I'm
want to do and didn't, but then I, um,
added everybody in the backstage group.
I added them to the repo cause I was
like, Hey y'all, I messed up.
I can't release it today.
Let me just add you to the
repo and you can poke around.
And so they've already been in there, you
know, poking around
and trying to figure out
like, Ooh, the more react
way to do it would be this way.
What do you think about this?
And I'm like, that seems cool.
Like keep going.
So react will come soon, but it won't be,
um, it won't be like
in the next week or two.
Gotcha.
Gotcha.
Um, all right.
So next security, um, I assume it would
be secure by default or
is it gonna open up to,
uh, if people that don't know what
they're doing, is it
possible to get hacked using
this?
And so, uh, I'll just say no, and then
I'll go into full, more full answers.
But if anybody clips
it, no, not possible.
Um, so I think the two vectors that would
expose something is
returning data over the
wire that you didn't mean to return.
Um, and what is going to happen there is
like, let's say you
return a model, right?
So you return a model.
Um, it's going to run through Laravel's
typical, uh, model to array thing.
And so, um, anything that, you know, I
think Laravel has a pins
hidden and then you can
just completely change the two array.
Um, so if that's the same as any regular
Laravel response or any
inertia passing down of props,
whatever you send over the wire is going
to go over the wire.
Um, so you could use a, you know, you
could use an API resort,
like a resource and wrap
up your models and
resources or something like that.
But there's no like, there's no safety
for what you decide to
return to the front end.
Um, I don't think that's
going to be too much of a problem.
I mean, I guess if you return the user, I
think actually password
is in the hidden field
by default.
Of course it's B scripted, but I think in
Laravel's default model, it's hidden.
So you don't even get the encrypted
password out or the hashed rather.
Um, so that should be fine.
The other vector that it exposes is it
provides, um, it provides
basically ingress points into
your application, right?
So you say like, Hey, I'm going to write
this fusion, uh,
component and here are the methods
that I want to expose to the front end.
Favorite, unfavorite, listen later,
whatever on the podcast sense.
Um, all of those
become addressable by HTTP.
So, um, you can, you know, if you were
clever, you could watch
when you hit the favorite
button.
You could watch the network and see how
we're sending back like,
Hey, target the favorite
method and you could try
to hit a different method.
Now, when that request comes in, fusion
will look and see like
what method are they trying
to hit.
And then we will reconfirm that that
method is supposed to be exposed.
Right?
And so as we're doing the build, we're,
we're, uh, introspecting
your PHP and figuring out
what are all the exposed methods.
And then we write those into the bundle
so that view knows
like, Hey, here's the list
of exposed methods you can use.
Um, of course somebody
could just change that.
And so we on the backend reconfirm, all
right, they're trying to
hit the favorite method.
Let's go look up that class on disk and
see if favorite is a
publicly exposed method.
If it's not, we'll just throw a four of
four because it's like, well, is it here?
Is it not?
Who knows?
But you can't touch it.
I think those are the two vectors, um,
that could be insecure.
And I think they're pretty safe.
Um, but of course if you find out that
that is not true, Aaron
at try hard studios, I
would love to receive your email.
Yeah.
Yeah.
Well, I mean, I always think of like
people, uh, new
developers opening up themselves to
security issues when they think about it.
And you know, you're just like, you just
assume everything's fine.
And you're like, Oh yeah.
Well, I guess I really shouldn't have
like exposed everybody's
email addresses on this
page or something.
Yeah.
Yeah.
And I think that's one that's like, um,
that that's, that's one
area that is slightly different
than what I understand live wire to be is
that we're like, once
we hand over the data
to the front end, you basically never
have to hand us that data back.
And so we're not like, um, we're not
worried about, um, the
data on the front end being
tinkered with and then handed back to the
backend to do something nefarious with.
We are more in, because we don't
re-instantiate state
from like the front end.
Really.
Um, we're more like a
traditional request response.
Um, you know, you're going to post to the
backend and we'll, we'll do some stuff.
Um, so that's, that's kind of, I'm
thinking where the lines
will be drawn, but yeah, I
definitely want to try to avoid, uh, foot
guns as much as possible.
Gotcha.
All right.
Next on my list, something else you
mentioned may be coming
actions per component.
Hmm.
Interesting.
Interesting.
So here's the, um, the setup right now is
that, um, you can
have a PHP block in your,
um, in your page, like in inertia
parlance, like you have a
page and that like maps to
a URL and the, you know, then inside of
that page, you've got
dozens of, you know, other
view components or whatever.
Right now you can write
PHP at the page level.
And so that would be like, you know,
podcasts slash index
or something, you know?
Um, but you cannot write PHP at the
component level, which
would be like a podcast row dot
view or something like that.
And I think it would be
nice to be able to do that.
So right now what you would have to do is
emit events to the
page level and then call,
you know, do your HTTP call there, which
is a totally normal thing to do.
Um, events up props down very normal, but
I think it would be
fun and potentially very
powerful to have each view component be
able to define basically
an API route or two that
you could do stuff with
at the component level.
Um, and I think that would simplify, um,
some of this like, uh,
cross component communication,
which always gets super hairy in, in any
language, in any framework.
It's like, how do I speak to my parent
component and my sibling components?
It's like, oh, that's kind of sucks.
You have to write an
event bus or something.
Um, so I think that is one
that could be really powerful.
I don't know that state will come down
into the component, uh,
level because I'm not entirely
sure how that would even work, but I do
think having like API
endpoints for your individual
components would be kind of awesome.
Yeah.
Yeah.
Which I know this is version one, you
know, you want to, uh, I
assume once you actually
publish it, people are going to come to
you with both pull
requests and tons of ideas
that you probably didn't think about.
Keep you busy for a while.
All right.
So tolling tolling is
my last one on my list.
Um, what, what, what's missing, I guess
tolling was just sort
of the IDEs or more.
Yeah.
So, um, there's, there's a little bit of
IDE love that needs to happen.
Um, so right now you open, you know,
podcast.vue, podcast.vue.
Um, and you can write a PHP block.
You can just say PHP opening tag is PHP
closing tag is PHP, just
like an XML tag, not like
the, the one we're
used to as PHP developers.
Um, and in PHP storm, you can configure
what is called a language injection.
And so you can tell PHP storm, Hey,
anytime you see this XML
tag, which is just PHP, um,
inject the, uh, PHP language that gives
you syntax highlighting.
That gives you a little bit of like, um,
a little bit of help.
What it doesn't know is it doesn't know
that you are in the
context of a Laravel application.
And so it doesn't look at your
composer.json, your class map autoloader.
It doesn't look at any of that.
And so you're still kind of in the wild,
wild West in terms of
like, I want to, you know,
use the auth facade.
It's not going to say like, Hey, let me
just auto import that for you.
It's like, Oh shoot, I
got to do that manually.
Um, fortunately, Taylor put me in touch
with somebody at JIT
brains and they are bouncing
around internally.
There's like four or five people on the
email now, um, trying
to figure out like, who's
the right person to talk to about making
PHP storm aware that
this is not just injected
PHP.
It's like full application PHP.
Go look at the autoloader,
figure out what classes exist.
Um, so I am hopeful that
that will be coming soon.
Fortunately, it's not like it's a new
language or anything.
It's not like I've invented new syntax.
It's just the exact same language in a
different place that we're not used to.
So I'm hoping that there's some little
code path inside of
that, you know, jet brains,
Java monstrosity that they can just be
like, yeah, that's, that's real PHP.
Um, in terms of VS code,
um, not something I use.
So I don't really know Miguel again, has
already figured out how
to do like, um, uh, tagged
template literal, which is like a
JavaScript thing and tag
it with PHP and then it will
inject PHP highlighting into there.
Um, but I imagine, uh, obviously VS code
is much more open
source, um, than jet brains
is.
And so I imagine people will figure that
part out pretty quickly.
Yeah.
The, I think I did see a tweet actually
speaking of jet brains of
the Laravel idea, the guy
that creates the Laravel idea package.
Yeah.
And he was going to add support for it.
Yeah.
He said something like, Oh,
it looks like I got work to do.
And it's like, Oh, cool.
Thanks guy.
I'm a paying, I'm a paying
Laravel idea subscribers.
Thank you.
I don't know who it is, but
thank you for all your work.
It's incredible.
Yes.
Yeah.
I think that's a must
have, uh, for me, okay.
You got to have that.
Yeah.
Um, I think that's all my questions on,
on, um, on this, um, fusion.
So what did I miss?
Anything else you want to talk about for
their launch or anything
that I may have missed?
No, I don't think so.
Um, I will, I will go back
again to like, what is the goal?
What is the vision?
And the vision is to pull
people into the Laravel ecosystem.
Um, so that is, that is my hope is that
we can continue to be,
um, we can continue to
be a port in the storm for people who are
like, boy, web
development has gotten complicated.
My hope is that people will, um, put down
their PHP preconceived notions, come over
to our side, realize that, Hey, we've got
basically everything
you would ever need to
build a full honest to
goodness SAS application.
Um, and hopefully, um, fusion can help
lower the bar to get some
of those, uh, very, very
intelligent, very productive people over
and have them use what I
think is a better backend.
That is, that is my hope.
Agreed.
Agreed.
Um, I love how Laravel is pushing, you
know, pushing the bar forward.
Um, you know, from the old days, I know
you're young man compared to me, but you
know, in my days, it, every framework
only stuck with what
they were like, it was only
PHP, like you did not branch out into CSS
or any of these things.
And I like how we've, you know, as a
community, we've sort of
embraced this that it's not
just PHP, like we're
having a full stack here.
We need to be able to support everything.
So I think it's awesome.
And I really like where the future's
headed for Laravel and with that mindset.
Thanks.
Thanks to our pragmatic, uh, benevolent
dictator Taylor for, for
leading the charge on that.
Exactly.
Exactly.
All right.
Well, Aaron, I want to thank you again
for taking a few minutes
here to talk about fusion
and, uh, good luck on the release and we
will do our best to
get the word out for you.
Thanks.
Also, if this release, if this podcast
releases on Friday,
when fusion releases and
you're listening to it, today is my
birthday, not today, but like when you're
listening to it today,
Friday is my birthday.
So please tell me happy birthday.
Yes.
Happy birthday.
And, um, thank you for everything you do
for, um, the
community and for what you're
building and just for being a
good human in our ecosystem.
So we appreciate you.
Thank you.
That's very nice.
It's always a joy to be here.
Um, I look forward to the release.
Hopefully it goes well.
