WEBVTT

NOTE
This file was generated by Descript 

00:00:05.000 --> 00:00:08.959
Raph: Hey friends, and welcome
to the Deep Stack Podcast.

00:00:08.965 --> 00:00:10.010
I'm your host Raph.

00:00:10.459 --> 00:00:11.430
Lio: I'm your host, Lio.

00:00:12.080 --> 00:00:15.860
Raph: This is the Deep Stack,
the Deep Stack Podcast where we

00:00:15.860 --> 00:00:20.930
explore everything in modern and
not so modern application stacks.

00:00:20.935 --> 00:00:25.509
Today we're gonna be breaking
down Lio's old project Noun.ly.

00:00:25.960 --> 00:00:28.619
So Lio, do you wanna tell us about Noun.ly

00:00:29.555 --> 00:00:33.725
Lio: yeah, it's a, it's a fun little
project that I started while I was,

00:00:33.725 --> 00:00:36.125
uh, working at Microsoft a decade ago.

00:00:36.695 --> 00:00:37.325
Raph: Nice.

00:00:37.625 --> 00:00:44.255
Lio: in, uh, this was 2000, um, Actually
more than a decade ago, like 2011.

00:00:44.675 --> 00:00:48.425
And, and Microsoft had entered
with Azure there, the cloud space.

00:00:48.425 --> 00:00:52.565
And so there was a hackathon to come
up with, uh, cloud projects and,

00:00:52.565 --> 00:00:57.965
and so Noun.ly is the project that
I built in that hackathon and I kept

00:00:57.965 --> 00:01:00.305
building on after leaving Microsoft.

00:01:00.605 --> 00:01:04.385
Actually it started as
it started@stinkybad.com

00:01:04.385 --> 00:01:05.405
and I think the URL still

00:01:05.515 --> 00:01:05.945
Raph: Excellent name.

00:01:06.645 --> 00:01:10.755
Lio: I, well, why it was funny was
was a website, or is a website?

00:01:10.785 --> 00:01:15.855
It's, it's a URL shortener, but it
uses nouns instead of like weird codes.

00:01:15.855 --> 00:01:16.095
Right.

00:01:16.095 --> 00:01:20.935
So Bitly and a tiny URL were very
big back then, or maybe still are.

00:01:21.595 --> 00:01:27.265
And I found them frustrating, uh, to
share URLs with people, uh, in, in real.

00:01:27.965 --> 00:01:29.225
They're unusable, right?

00:01:29.225 --> 00:01:34.145
Because you got a code with like eight
Q p r capital seven, so it doesn't work.

00:01:34.385 --> 00:01:39.215
And so I, I had this idea of using noun
only and, uh, announced using nouns.

00:01:39.220 --> 00:01:42.875
And because it was nouns, I took a
domain name that was like an adjective.

00:01:42.875 --> 00:01:44.345
So everything was kind of funny.

00:01:44.345 --> 00:01:49.115
I ended up with stinky back chair, stinky
horse, stinky bat, you know, uh, unknown.

00:01:49.445 --> 00:01:50.015
Raph: Yeah.

00:01:50.255 --> 00:01:54.775
Lio: Um, So I, I build that, uh, and.

00:01:55.770 --> 00:02:01.770
I build them on, uh, a very early
Azure, right, the 2011 kind of Azure.

00:02:02.400 --> 00:02:07.230
Interestingly, Azure was one of the first
that provided platform as a service before

00:02:07.230 --> 00:02:09.180
they even had infrastructure at a service.

00:02:09.185 --> 00:02:10.800
You, you didn't even have VMs yet.

00:02:11.310 --> 00:02:16.770
And so it ended up being like a
Azure website, I think it was called.

00:02:16.770 --> 00:02:17.340
It was running on

00:02:17.340 --> 00:02:17.970
iis.

00:02:18.760 --> 00:02:21.080
Raph: remember that, like that term.

00:02:21.780 --> 00:02:22.799
Lio: It was kind of fun.

00:02:22.799 --> 00:02:23.340
I thought.

00:02:23.340 --> 00:02:25.680
Uh, the experience was cool.

00:02:25.680 --> 00:02:31.680
You, uh, you had the command line, you
started a new Azure website project

00:02:31.890 --> 00:02:37.079
and there was like a dash dash GI that
would give you, uh, like a get in edited

00:02:37.109 --> 00:02:40.530
folder and as well as a, a remote repo.

00:02:40.530 --> 00:02:45.120
And then any get push that
you did, uh, they had their.

00:02:45.929 --> 00:02:49.410
Builder, uh, that I, I
forgot what it's called.

00:02:49.410 --> 00:02:53.249
Like something with a K that would look
at your files and then figure out whether

00:02:53.249 --> 00:02:56.579
it was like a Python or a, uh, C sharp.

00:02:56.670 --> 00:03:01.260
I think the initial, the first version
I, I built was C Sharp, and then it

00:03:01.260 --> 00:03:05.100
would build it and, and push it and host
it and, and that experience to go from,

00:03:05.799 --> 00:03:11.230
um, you know, using the command line to
get a empty folder and then get, commit,

00:03:11.230 --> 00:03:13.600
get, push, and it was up and running.

00:03:14.299 --> 00:03:17.589
Uh, I think everybody was still
catching up to, to that behavior,

00:03:17.649 --> 00:03:19.450
uh, to that ex deaf experience.

00:03:19.450 --> 00:03:20.679
So I, I really liked it.

00:03:21.394 --> 00:03:25.984
course, it was, it was very microsofty,
you know, like, it was like C sharp,

00:03:26.314 --> 00:03:29.644
uh, only I s no, no Linux containers.

00:03:29.674 --> 00:03:35.194
Uh, so, um, so, so that was the,
the first version of stinky bad.

00:03:36.124 --> 00:03:39.154
But then when I, when I left
Microsoft, that's when I started using.

00:03:40.114 --> 00:03:42.154
Like more open source tools.

00:03:42.334 --> 00:03:48.274
So I, I rewrote the app and, uh, D Lang
like that, that was like the, the, the

00:03:48.274 --> 00:03:49.385
thing, the language that.

00:03:49.390 --> 00:03:51.515
I used for my hobby, hobby projects.

00:03:52.214 --> 00:03:56.004
Um, and so I, I, I, I,
I wanted to use that.

00:03:56.394 --> 00:04:01.464
Uh, I started using, uh, instead
of, of course d if you push decodes

00:04:01.464 --> 00:04:04.254
to the, to the Azure websites, I
didn't know what to do with it.

00:04:04.554 --> 00:04:10.499
So I had to build my own, uh, But then
by that time, Azure websites had docker

00:04:10.559 --> 00:04:16.499
support, so you could actually, uh, it, it
could, uh, host containers as well as raw,

00:04:16.684 --> 00:04:17.864
Raph: What year was that?

00:04:18.569 --> 00:04:18.989
Lio: Sorry,

00:04:19.454 --> 00:04:20.009
Raph: What year was that?

00:04:20.009 --> 00:04:22.139
That they started to
support Docker containers.

00:04:22.409 --> 00:04:25.979
Lio: uh, I don't know,
maybe, maybe 16 or something.

00:04:25.984 --> 00:04:27.029
2016.

00:04:27.119 --> 00:04:27.689
Raph: Okay.

00:04:27.694 --> 00:04:27.929
Yeah.

00:04:28.039 --> 00:04:30.479
Lio: I don't remember, but
that was some much later.

00:04:30.989 --> 00:04:31.499
Raph: okay.

00:04:31.530 --> 00:04:32.789
Yeah, I was, I was surprised.

00:04:32.789 --> 00:04:36.119
I was like, wait, that the, the
timeline, I, I, I thought it was just

00:04:36.119 --> 00:04:39.569
like maybe a, a few years after, and I
was like, that's, that's impressive of

00:04:39.569 --> 00:04:41.639
the, or that, that early on the, the,

00:04:41.639 --> 00:04:42.479
container train.

00:04:42.854 --> 00:04:46.724
Lio: that particular feature with Docker
containers got renamed a bunch of times.

00:04:46.754 --> 00:04:47.354
Uh uh.

00:04:47.354 --> 00:04:49.734
Now it's, even now I think it's called.

00:04:50.434 --> 00:04:53.494
Uh, Azure website for Docker or something.

00:04:53.764 --> 00:04:55.534
I, I, I don't, I don't
keep up with the naming,

00:04:56.224 --> 00:04:56.794
Raph: Yeah.

00:04:57.304 --> 00:05:02.374
Lio: yeah, so, so that the whole
stack from Stinky Bad has been

00:05:02.374 --> 00:05:03.964
completely rewritten around that time.

00:05:03.964 --> 00:05:07.819
Like maybe five, six,
um, Or two, 2016 ish.

00:05:08.209 --> 00:05:10.669
So that's when I also got
the domain name, noun.

00:05:10.999 --> 00:05:11.209
Noun.

00:05:11.929 --> 00:05:15.619
Actually, that was a little
earlier, I think maybe 2015, to be

00:05:15.624 --> 00:05:17.449
honest, because people liked it.

00:05:17.449 --> 00:05:19.729
You know, people started
using it, uh, stinky bad.

00:05:19.729 --> 00:05:23.839
I actually got, I, I got like a bunch
of emails from users that said, Hey,

00:05:23.839 --> 00:05:29.239
I, I want to use, Uh, stinky on my,
uh, presentation, but I, I cannot

00:05:29.239 --> 00:05:33.859
show stinky bad.com on, on at work,
you know, so is there a way I can

00:05:33.859 --> 00:05:35.479
have a, a different domain name?

00:05:35.914 --> 00:05:36.604
Raph: Yeah.

00:05:37.459 --> 00:05:41.299
Lio: Um, and actually it, it was,
presentations was the perfect use case

00:05:41.304 --> 00:05:48.499
because yeah, URLs in a presentation are
pretty much pointless because people can't

00:05:48.504 --> 00:05:51.859
get it and they'll have to wait until
you mail if, if you mail them the deck.

00:05:52.439 --> 00:05:52.774
Raph: Yeah.

00:05:53.689 --> 00:06:00.409
Lio: And so around that same time, I got
the domain noun.ly as well as Noun.ly.com.

00:06:01.109 --> 00:06:07.709
And I, I added QR code, code generator
so that on your slide you could put both

00:06:07.714 --> 00:06:12.299
the noun as well as the, the QR code, uh,
which because the nouns are short, the

00:06:12.299 --> 00:06:17.909
QR code kind of had a, uh, didn't require
very high resolution, right, because you

00:06:17.909 --> 00:06:19.679
didn't have a lot of bits to put in there.

00:06:20.144 --> 00:06:20.424
Raph: Yeah.

00:06:21.304 --> 00:06:26.044
Lio: at that time, the new,
well now old, but the new

00:06:26.044 --> 00:06:28.234
stack, uh, was, uh, built right?

00:06:28.234 --> 00:06:34.564
So the backend was rewritten in D Lang
using, uh, these vid, uh, web framework,

00:06:35.074 --> 00:06:36.814
which was back then was state of the art.

00:06:36.844 --> 00:06:39.814
It was like asynchronous, you
know, all the, all the, the

00:06:39.814 --> 00:06:42.274
good stuff, uh, co routine.

00:06:42.874 --> 00:06:48.724
All the stuff that, you know, uh, the,
the new modern web frameworks and no

00:06:48.724 --> 00:06:54.634
js, python, uh, rust, they, they all use
that same kind of architecture right now.

00:06:54.639 --> 00:06:56.464
Fived is very dated.

00:06:56.644 --> 00:07:01.454
Uh, um, but yeah, so
that's what it's using now.

00:07:01.454 --> 00:07:04.124
So if you go to now, that's
what it's using, it's using

00:07:04.124 --> 00:07:05.924
the fived at the backend.

00:07:06.624 --> 00:07:09.714
Uh, it, it's not using any,
any front end framework.

00:07:09.714 --> 00:07:10.494
Everything is.

00:07:11.194 --> 00:07:17.314
Uh, pretty raw, uh, handwritten,
uh, Java script and css.

00:07:18.014 --> 00:07:23.444
I, I think it, it was using, what's
the Twitter CSS framework called again?

00:07:23.574 --> 00:07:24.484
Raph: Oh, bootstrap.

00:07:24.614 --> 00:07:25.154
Lio: I guess so.

00:07:25.184 --> 00:07:25.814
Yeah, bootstrap.

00:07:25.819 --> 00:07:26.864
I think it was using Bootstrap.

00:07:26.864 --> 00:07:29.854
I kind of forgot cause I haven't touched,
I haven't touched it in a long time.

00:07:30.419 --> 00:07:32.609
Raph: You know what I love,
so I just went to the website.

00:07:33.104 --> 00:07:37.349
I like that you have a
little beta, beta banner on

00:07:37.349 --> 00:07:38.189
the top left.

00:07:38.194 --> 00:07:42.359
Lio: beta I got from Google, so I'm,
that's, that's like a disclaimer

00:07:43.059 --> 00:07:44.979
Raph: It's a, it's a 12 year old beta.

00:07:45.549 --> 00:07:46.089
Lio: of beta.

00:07:46.789 --> 00:07:47.209
Raph: Yep.

00:07:47.689 --> 00:07:50.389
Lio: so the, the, so talk
about deep stack, right?

00:07:50.389 --> 00:07:56.969
So front end is, uh, handwritten
html, uh, with, uh, cs.

00:07:57.669 --> 00:08:01.119
Raph: That's, that's, uh,
called that artisanal HTML

00:08:01.239 --> 00:08:02.619
Lio: Oh yeah, exactly.

00:08:02.629 --> 00:08:03.299
Exactly.

00:08:03.969 --> 00:08:08.709
Um, which to be honest, for that kind of
single page app, I really think I don't

00:08:08.714 --> 00:08:10.659
need a, i, I don't need a framework.

00:08:10.659 --> 00:08:10.749
Right.

00:08:10.989 --> 00:08:11.639
Raph: I agree.

00:08:12.399 --> 00:08:17.079
Lio: The, the jQuery's biggest
feature, the dollar sign I just

00:08:17.079 --> 00:08:18.939
built as a, you know, as a one-liner.

00:08:19.209 --> 00:08:24.189
And, and so to reference, uh,
elements, you, you, I, I use that,

00:08:24.819 --> 00:08:26.799
uh, that same kind of, uh, style.

00:08:27.309 --> 00:08:29.929
Um, uh, I al and, and so.

00:08:30.739 --> 00:08:34.849
There's only one rest call basically
there you can, uh, create a noun

00:08:34.849 --> 00:08:36.229
and you can dereference a noun.

00:08:36.589 --> 00:08:38.659
So that's, that's pretty much it.

00:08:39.319 --> 00:08:43.249
Uh, I also built, uh, two, uh, two
native apps for iOS and Android

00:08:43.684 --> 00:08:44.314
Raph: Oh,

00:08:44.689 --> 00:08:45.949
Lio: in similar fashion.

00:08:45.979 --> 00:08:48.499
I, I, I didn't use any
framework for those.

00:08:48.664 --> 00:08:50.284
Raph: are they still up on the app stores?

00:08:50.869 --> 00:08:51.949
Lio: They should be there,

00:08:52.204 --> 00:08:53.914
Raph: All right, cool.

00:08:54.810 --> 00:08:56.989
Lio: honestly, I, I,
I need to revamp them.

00:08:56.989 --> 00:08:58.009
I, I wonder if they.

00:08:58.834 --> 00:09:00.514
Still work because as the

00:09:01.354 --> 00:09:01.624
Raph: Oh,

00:09:01.774 --> 00:09:07.294
Lio: of times the, the operating
system, um, get revamped and, and if

00:09:07.294 --> 00:09:11.254
you do not recompile and re-upload
your app, they'll, they'll just don't

00:09:11.254 --> 00:09:13.024
make it show up on the newer devices.

00:09:13.414 --> 00:09:16.324
And so it's possible that, uh, it's not

00:09:16.354 --> 00:09:17.134
Raph: longer listed.

00:09:18.094 --> 00:09:18.574
Lio: It could be.

00:09:18.574 --> 00:09:18.814
Yeah.

00:09:18.964 --> 00:09:19.354
Raph: Yeah.

00:09:19.414 --> 00:09:19.774
Yeah.

00:09:19.834 --> 00:09:20.074
It's gone.

00:09:20.774 --> 00:09:24.944
Lio: so I, I didn't use a
framework for the native.

00:09:25.644 --> 00:09:26.334
Raph: Yep.

00:09:26.484 --> 00:09:28.974
Lio: Partly because that, that
is kind of how I learn things.

00:09:28.974 --> 00:09:33.384
And same, same as, you know, not using
jQuery and using JavaScript and, and

00:09:33.384 --> 00:09:39.504
writing CSS and html, if you don't know
the pain points of doing that, I, I,

00:09:39.509 --> 00:09:43.614
I don't think you'll, you'll know the
value that frameworks provide or which

00:09:43.619 --> 00:09:49.884
framework even to go for because you, you,
you, you want to address that pain and

00:09:49.884 --> 00:09:54.264
if maybe the pain isn't even there, like
in the case of of of front end for noun.

00:09:54.964 --> 00:09:59.204
Honestly, there is no pain in
using JavaScript and XML http.

00:09:59.209 --> 00:10:04.284
There was no fetch api, right, so the
XML http request to talk to a backend.

00:10:04.984 --> 00:10:06.144
Honestly, it's, it's, it's not a big deal.

00:10:06.444 --> 00:10:06.954
Raph: Yeah.

00:10:07.435 --> 00:10:11.645
Lio: Incidentally, my team and
Microsoft was in charge of XML H

00:10:11.650 --> 00:10:16.115
G T P request, so I did not have a
problem with XML H G T P request.

00:10:16.324 --> 00:10:16.984
Raph: Yep.

00:10:17.045 --> 00:10:17.314
Yep.

00:10:17.974 --> 00:10:24.935
Lio: One of my first tasks joining
that team was actually, uh, xml, H E T

00:10:24.935 --> 00:10:30.514
p request had been added to Microsoft
Internet Explorer by the office team.

00:10:31.339 --> 00:10:35.770
I became a standard afterwards,
and then people started complaining

00:10:35.775 --> 00:10:38.150
that that Microsoft browser
didn't support the standard.

00:10:38.150 --> 00:10:42.499
So my first task was to change
XML H G T P request and Internet

00:10:42.499 --> 00:10:43.999
Explorer to follow the standard.

00:10:43.999 --> 00:10:45.379
So that was kind of a fun task.

00:10:45.739 --> 00:10:49.310
So for me to use XML, H G T P
request was, was not a big issue.

00:10:49.369 --> 00:10:54.349
If you know the, the quirks, it's,
it's a, it was never intended as,

00:10:55.250 --> 00:10:57.590
As a beautiful API for external use.

00:10:57.590 --> 00:11:00.110
It just became the begin
beginning of Ajax, right?

00:11:00.620 --> 00:11:04.020
Um, um, so that was the front end.

00:11:04.020 --> 00:11:09.190
And again, doing that handwritten full
circle loop really makes you appreciate.

00:11:09.974 --> 00:11:13.395
When to use a framework, what
framework you to use, which parts

00:11:13.395 --> 00:11:17.114
to use it for instead of blindly
using every feature available.

00:11:17.114 --> 00:11:17.295
Right.

00:11:18.224 --> 00:11:21.255
Um, and so the same for,
for the native apps.

00:11:21.255 --> 00:11:24.194
This is, again, a, a,
a one page application.

00:11:24.974 --> 00:11:27.464
Um, I, I didn't feel the

00:11:27.469 --> 00:11:27.795
need to

00:11:27.795 --> 00:11:28.484
use, like,

00:11:28.620 --> 00:11:29.610
Raph: and Java.

00:11:30.285 --> 00:11:36.494
Lio: so I think I, I used Kotlin on
Android and I used, uh, well Swift on iOS.

00:11:36.839 --> 00:11:37.410
Raph: Yeah.

00:11:38.219 --> 00:11:43.020
Lio: And, and, and here's my biggest
takeaway from this project was that

00:11:43.050 --> 00:11:48.870
once you design your model view, uh,
view model, right, your, your model

00:11:48.870 --> 00:11:52.770
view controller, the, the new model
view, view model, M V V M architecture,

00:11:52.770 --> 00:11:57.060
once you design that architecture,
uh, it's the same for both apps.

00:11:57.750 --> 00:12:01.949
And, and so defining what your model looks
like, what your model view looks like.

00:12:02.670 --> 00:12:03.780
What your views look like.

00:12:03.839 --> 00:12:05.969
That is 80% of the job.

00:12:05.969 --> 00:12:10.589
Then translating that into,
translating that twice, once into

00:12:10.589 --> 00:12:13.349
Swift and once into, into Kotlin,

00:12:14.130 --> 00:12:14.489
Raph: Not a

00:12:14.589 --> 00:12:15.510
Lio: it's really negligible.

00:12:15.540 --> 00:12:20.980
Like it's, it's like, um, like the, I
I always say like, in our profession,

00:12:20.980 --> 00:12:22.630
typing is the least of my worry.

00:12:22.930 --> 00:12:27.250
You know, like designing something
like good architecture and, and a

00:12:27.250 --> 00:12:29.380
stable, uh, resilient architecture.

00:12:29.380 --> 00:12:30.490
That, that is the hard part.

00:12:30.490 --> 00:12:30.670
Right.

00:12:30.670 --> 00:12:30.969
So,

00:12:31.329 --> 00:12:34.840
Raph: so what you're saying is chat,
G P T is not taking our jobs just yet.

00:12:35.215 --> 00:12:38.305
Lio: Well, un unless they get
into, in, into the designing

00:12:38.590 --> 00:12:39.160
Raph: Yeah.

00:12:39.220 --> 00:12:39.610
Yeah.

00:12:39.625 --> 00:12:39.805
Lio: Yeah.

00:12:39.805 --> 00:12:44.095
So typing the same architecture twice,
once in, in Kotlin, one's in Swift.

00:12:44.575 --> 00:12:45.505
No problem at all.

00:12:45.505 --> 00:12:47.965
In fact, both apps are open source.

00:12:47.965 --> 00:12:51.115
So, and, and if you look at them,
it's kind of funny, I, all the files

00:12:51.115 --> 00:12:52.735
on the folders have the same name.

00:12:53.185 --> 00:12:57.685
Just one is written for iOS and the other
one is, is written in, uh, in Kotlin.

00:12:58.515 --> 00:13:02.185
And then there, there's, of course,
there's 20% is, uh, different

00:13:02.185 --> 00:13:03.145
in the operating system, right?

00:13:03.145 --> 00:13:03.265
Yeah.

00:13:03.270 --> 00:13:07.915
You, once you get to storage, for
example, they all have their, their own

00:13:07.915 --> 00:13:12.505
way of doing, uh, local preferences,
local store, uh, stuff like that.

00:13:12.925 --> 00:13:17.875
Their, their fetch api, you know, the
HTP API is a little different, but

00:13:18.665 --> 00:13:23.305
honestly, you, you write small, thin
abstractions and then the rest of your

00:13:23.305 --> 00:13:27.325
app looks the same and it's beautiful
because you end up at the same box in.

00:13:28.300 --> 00:13:33.340
And you fix them in both as opposed
to if you used to, uh, web frameworks,

00:13:33.490 --> 00:13:38.080
if you use a iOS framework or, or
like one of those phone gap things.

00:13:38.860 --> 00:13:39.910
I, I'm not a fan.

00:13:39.910 --> 00:13:43.810
You get their own, they have their own
quirks and now you're one step further

00:13:43.815 --> 00:13:45.940
away from the, the source of the problem.

00:13:45.940 --> 00:13:48.850
And I find debugging a higher
level problem, always harder

00:13:48.850 --> 00:13:50.140
than debugging a low level one.

00:13:50.635 --> 00:13:52.375
Raph: Yeah, I can see that.

00:13:52.375 --> 00:13:55.795
I will in a, in a future episode,
perhaps I will push back on

00:13:55.795 --> 00:13:56.905
a little bit of that, but,

00:13:57.605 --> 00:14:04.035
Lio: Yeah, I, I, I know exactly when
to appreciate those, uh, frameworks

00:14:04.635 --> 00:14:07.545
after having, you know, doing
the, the, the manual work.

00:14:07.920 --> 00:14:08.460
Raph: Yep.

00:14:08.955 --> 00:14:11.385
Lio: Um, so we, we are going
through the stack, right?

00:14:11.385 --> 00:14:16.245
We, we have, uh, art Artisan
Know, H M l, JavaScript, css.

00:14:16.665 --> 00:14:20.955
Uh, Uh, native apps, uh,
Kotlin and, and Swift.

00:14:21.795 --> 00:14:25.875
Um, our, our REST api, very
straightforward rest API

00:14:25.875 --> 00:14:29.145
with just crud, crud, nouns.

00:14:29.145 --> 00:14:32.955
Basically, you know, you can post, you
get a noun, you can delete that noun, you

00:14:32.955 --> 00:14:34.785
can get it to the reference, the noun.

00:14:35.655 --> 00:14:37.335
Raph: What, uh, what
database are you using?

00:14:37.865 --> 00:14:38.865
Lio: Um, yeah, okay.

00:14:38.865 --> 00:14:40.575
That is still Azure table actually.

00:14:40.575 --> 00:14:46.995
So I, I wanted to, in that new world of
cloud, uh, they had introduced Azure.

00:14:47.505 --> 00:14:53.415
Uh, Azure Blob Store, Azure Table
Store, and uh, there was a third one.

00:14:54.115 --> 00:14:57.805
The, the very Early Storage
Services or Azure queue.

00:14:57.835 --> 00:15:02.065
Yeah, those were the first three high
level storage services that Azure

00:15:02.065 --> 00:15:04.555
provided back in the, the early tents.

00:15:05.255 --> 00:15:06.845
And so I, I used Azure Table,

00:15:07.535 --> 00:15:08.225
Raph: Okay.

00:15:08.225 --> 00:15:10.835
Lio: is kind of like a
precursor to Dynamo, right?

00:15:11.535 --> 00:15:13.815
Dyna might have been around
actually because a Azure was

00:15:13.815 --> 00:15:17.955
really catching up on, on a Amazon
in the early, early cloud years.

00:15:18.555 --> 00:15:21.795
But Azure Table was perfect because
they have this key value kind of

00:15:21.800 --> 00:15:23.835
behavior and and the key is the nouns.

00:15:23.895 --> 00:15:27.555
Raph: Wait, but so you had
this, you had this back in 2011.

00:15:28.275 --> 00:15:28.545
Lio: right?

00:15:28.545 --> 00:15:28.815
Yep.

00:15:29.175 --> 00:15:29.475
Raph: Okay.

00:15:30.175 --> 00:15:31.465
Lio: So I was using Azure Table.

00:15:31.465 --> 00:15:34.375
I, I'm still using Azure
Table as a key value store.

00:15:35.005 --> 00:15:41.645
Um, so as stinky, bad, and now only got
more popular, I, I ran out of nouns.

00:15:41.795 --> 00:15:44.855
And so the nouns became limited in time.

00:15:44.855 --> 00:15:48.635
So after 24 hours, your link
might no longer be valid because

00:15:48.640 --> 00:15:51.935
it, there's like a garbage, lazy
garbage collection that's happening.

00:15:52.565 --> 00:15:57.905
And, but you can get, and, and as nouns
are taken, You end up with more nouns.

00:15:57.905 --> 00:16:01.895
So instead of stinky bad chair, you would
end up with stinky bad horse chair, right?

00:16:01.955 --> 00:16:03.605
And, and still was fun.

00:16:03.695 --> 00:16:06.605
Oftentimes you end up with
very fun combinations.

00:16:06.885 --> 00:16:07.375
Raph: Yeah.

00:16:08.015 --> 00:16:11.615
Lio: Um, and, and key value
store was perfect, right?

00:16:11.615 --> 00:16:16.055
You have a, you have a key and, and the
value becomes the URL that is being de

00:16:16.055 --> 00:16:17.915
referenced, but plus a bunch of metadata.

00:16:18.615 --> 00:16:22.846
Uh, interestingly, as soon as these,
the site was up and running, I, I

00:16:22.851 --> 00:16:27.615
got a shitload of spam because all
of these bots, anytime they see a

00:16:27.615 --> 00:16:29.505
added box, they just put links in it.

00:16:29.505 --> 00:16:29.745
Right?

00:16:29.895 --> 00:16:31.485
You get like a lot of spam.

00:16:32.025 --> 00:16:38.475
So, so in, in the backend, I, I, I
think 60% of the backend code is anti.

00:16:39.175 --> 00:16:43.870
So I, I do like the, the, i I do like
a honeypot in the HTML form, right?

00:16:43.870 --> 00:16:50.560
So that means like a bogus field with
like a, a, a display non CSS class

00:16:51.189 --> 00:16:55.270
that bots, if bots put something in
there, then you know, it's a bot.

00:16:55.479 --> 00:16:58.630
I, I reference, uh,
two external honeypots.

00:16:58.635 --> 00:17:02.140
So there is the honeypot project
actually, that, that was cloud flare.

00:17:02.860 --> 00:17:06.179
First project, uh, cloud flares.

00:17:06.190 --> 00:17:11.079
Uh, before it was called CloudFlare,
there was honeypot, uh, project.org,

00:17:11.110 --> 00:17:16.810
I think, uh, where people would, uh,
volunteer to put a piece of form on

00:17:16.810 --> 00:17:19.810
their website that cloud honeypot.

00:17:19.810 --> 00:17:26.380
So the early CloudFlare would, uh, use
to detect, um, bots and, and keep a, a.

00:17:27.190 --> 00:17:31.420
A blacklist of these, uh, of
these bots, of these IP addresses

00:17:31.600 --> 00:17:32.830
that these bots were using.

00:17:33.219 --> 00:17:35.320
And so that was called a rbl, I think.

00:17:35.409 --> 00:17:41.390
Uh, RBL stood for, um, request
block list or something.

00:17:41.390 --> 00:17:42.770
I forgot what the R stood for.

00:17:43.245 --> 00:17:43.525
Raph: Yeah.

00:17:44.225 --> 00:17:48.455
Lio: Um, And so, and, and there's
another one, uh, spam house.org.

00:17:48.515 --> 00:17:52.715
So I, these, both of these have
public RBLs and these RBLs, you can

00:17:52.715 --> 00:17:57.125
query them using DNS is actually kind
of funny, an API designed on dns.

00:17:57.575 --> 00:18:03.245
So to, to query these databases,
you would craft a, uh, DNS request.

00:18:03.245 --> 00:18:06.995
So you would ask, what is the IP
for, you know, for this domain.

00:18:07.205 --> 00:18:09.215
But the domain was not,
not a real domain, right?

00:18:09.215 --> 00:18:10.325
So basically the.

00:18:11.105 --> 00:18:14.315
You the, the, the IP address
that you want to query,

00:18:14.470 --> 00:18:15.080
Raph: Mm-hmm.

00:18:15.335 --> 00:18:20.355
Lio: uh, you, you pre-end
it to their, uh, RBL domain.

00:18:20.355 --> 00:18:25.065
So I think it was like rbl
dot spam house.org and rbl dot

00:18:25.575 --> 00:18:28.095
uh, uh, project honeypot.org.

00:18:29.040 --> 00:18:32.820
And so you, you repent the IP address
and then it would return an IP address.

00:18:32.820 --> 00:18:36.720
If it says not found, like, you
know, an X domain, uh, IP, not,

00:18:36.720 --> 00:18:39.600
uh, or domain address not found,
then, then it was not in the list.

00:18:39.810 --> 00:18:43.320
If it returns an IP address,
then that IP address instead

00:18:43.320 --> 00:18:44.880
of, it's not a real IP address.

00:18:44.885 --> 00:18:49.410
In fact, it would always be
local host, always do 1 27 0 0

00:18:49.890 --> 00:18:54.120
x, and then the last digit, uh,
of the IP address actually tells.

00:18:54.840 --> 00:18:57.980
Some metadata about, you
know, why it was blocked.

00:18:58.310 --> 00:18:58.790
Raph: Okay.

00:18:58.880 --> 00:19:01.610
I feel like I vaguely remember
coming across this many

00:19:01.800 --> 00:19:03.050
Lio: Yeah, it's kind funny.

00:19:03.290 --> 00:19:03.440
Raph: Yeah.

00:19:03.830 --> 00:19:07.310
Lio: Uh, and so, and, and so I,
I did that, I did, uh, the form

00:19:07.315 --> 00:19:10.040
honeypot two, uh, RBL queries.

00:19:10.520 --> 00:19:14.660
And then there's a little bit of, um,
because my now only doesn't have a login,

00:19:14.750 --> 00:19:19.250
so it doesn't have an idea of a session
and I didn't want to get into that.

00:19:19.580 --> 00:19:21.410
Um, that, that is like a rabbit hole.

00:19:21.410 --> 00:19:22.090
I didn't wanna get,

00:19:22.790 --> 00:19:23.195
Raph: Yeah.

00:19:23.900 --> 00:19:28.280
Lio: so to prevent spam, I
did, um, kind of proof of work.

00:19:28.280 --> 00:19:34.520
So, so the, the no only JavaScript
when you post the JavaScript

00:19:34.970 --> 00:19:39.050
calculates a bunch of hashes with,
with, uh, with the current time.

00:19:39.770 --> 00:19:43.640
Uh, and the, and the salt that
keeps changing until that hash

00:19:43.760 --> 00:19:46.610
ends in a number, a bunch of zeros.

00:19:46.610 --> 00:19:50.810
It's kind of like how, how the
early, well, so how, how Bitcoin,

00:19:51.170 --> 00:19:53.630
but also the early, um, cash hash.

00:19:53.930 --> 00:19:56.780
So cash hash was an anti-spam,
pre pret Bitcoin, right?

00:19:56.880 --> 00:19:58.640
Uh, uh, anti-spam mechanism.

00:19:59.270 --> 00:20:01.040
And so inspired by cash.

00:20:01.940 --> 00:20:06.140
The, the website, when you do a post
on ly form it, it does a bunch of

00:20:06.140 --> 00:20:10.010
these iterations until it has a hash
with a bunch of zeros, and then it's

00:20:10.015 --> 00:20:14.000
very quickly to test backend, whether
there's zeros in the, in the hash.

00:20:14.270 --> 00:20:19.680
So using these, that's why I mean,
60% is anti-spam in, in the, in

00:20:19.680 --> 00:20:23.880
the backend because of the actual
key value is, is very simple.

00:20:24.405 --> 00:20:25.065
Raph: Wild.

00:20:25.360 --> 00:20:31.120
Lio: Uh, Um, yeah, so, uh, we, the
storage is just key value store.

00:20:31.510 --> 00:20:33.880
It can, honestly, it can be
any key value store because I'm

00:20:33.880 --> 00:20:35.770
not using any, any fanciness.

00:20:36.580 --> 00:20:39.520
The only fancy feature, it's
not fancy anymore because

00:20:39.520 --> 00:20:41.080
now every store provides it.

00:20:41.560 --> 00:20:45.880
The on the only fanciness is
the optimistic locking, right?

00:20:45.880 --> 00:20:48.090
So if you have multiple.

00:20:48.790 --> 00:20:51.520
Uh, customers going to the website,
multiple users going to the

00:20:51.520 --> 00:20:55.330
website, and they, because of the,
the algorithm is deterministic

00:20:55.330 --> 00:20:57.070
when it returns a noun for a url,

00:20:57.455 --> 00:20:57.970
Raph: Mm-hmm.

00:20:58.670 --> 00:21:00.680
Lio: um, it's not random.

00:21:01.270 --> 00:21:01.760
Raph: Okay.

00:21:02.105 --> 00:21:05.975
Lio: And so it's there, there's a risk
that both would get the same noun.

00:21:06.125 --> 00:21:09.065
And so how do you prevent
this kind of concurrency?

00:21:09.125 --> 00:21:10.865
And I'm using optimistic locking.

00:21:11.225 --> 00:21:15.215
Optimistic locking boils down to
every record keeping track of aversion

00:21:15.845 --> 00:21:17.855
and when the record is updated.

00:21:17.855 --> 00:21:22.745
So for in, in the noun only case, the
key is the, the noun or nouns that you.

00:21:23.445 --> 00:21:24.735
That you're about to get right?

00:21:25.035 --> 00:21:28.815
So when a record gets updated, it
has to provide the version that it's

00:21:29.145 --> 00:21:30.585
of the record that it's updating.

00:21:31.005 --> 00:21:35.550
So if somebody wins the race, Then
your version would no longer match.

00:21:35.550 --> 00:21:38.910
And, uh, and there's an iteration
loop a second time where it picks

00:21:38.910 --> 00:21:44.460
another noun and, and it would try
again until it, your browser wins the

00:21:44.460 --> 00:21:48.540
race and, and you get the nouns, uh,
displayed in, in your browser window.

00:21:48.930 --> 00:21:53.700
So optimistic locking is how you avoid
like locking database tables, locking

00:21:53.700 --> 00:21:56.640
records, all this kind of locking, which.

00:21:57.585 --> 00:22:01.095
If you do not unlock, you know, you,
you can get into a deadlock, you can

00:22:01.095 --> 00:22:06.375
get into, uh, a lock that that has to
expire before somebody can do something.

00:22:06.375 --> 00:22:08.475
So, locking to me is
something to be avoided.

00:22:08.805 --> 00:22:09.435
Raph: Yeah,

00:22:10.135 --> 00:22:13.315
Lio: And, and now a lot of these
key value stores, right, Redis,

00:22:13.735 --> 00:22:18.685
uh, NATS Dynamo, they all have this
optimistic locking, uh, as a pattern.

00:22:18.985 --> 00:22:19.555
Raph: Yep.

00:22:20.555 --> 00:22:24.515
Lio: Um, so, and then, then the
last thing I was around the same

00:22:24.515 --> 00:22:27.425
time, I, I got to know, uh, Nick's.

00:22:27.485 --> 00:22:31.915
So the next package manager, I've
been using macros, but with the NS

00:22:31.920 --> 00:22:38.225
package manager and, and the NS package
manager and can build Docker images.

00:22:38.315 --> 00:22:42.155
And it's kind of cool because
if you use Nix to build a Docker

00:22:42.155 --> 00:22:43.955
image, the Docker image will g.

00:22:45.135 --> 00:22:47.505
only stuff that is referenceable, right?

00:22:47.505 --> 00:22:51.975
The, the, the way Nix works,
everything has a hash based on the,

00:22:51.975 --> 00:22:54.135
the sources that were used to generate.

00:22:54.825 --> 00:22:57.585
And so when you start with
your binary, which is my noun,

00:22:57.585 --> 00:22:59.895
only the language binary,

00:23:00.285 --> 00:23:00.705
Raph: Yep.

00:23:00.915 --> 00:23:02.235
Lio: basically scans that binary.

00:23:02.235 --> 00:23:05.805
And if there's a hash to TC
data at dc, data will be pulled

00:23:05.805 --> 00:23:07.575
in if there's a hash to gyps.

00:23:08.430 --> 00:23:11.970
Which the, there probably isn't
because it was using D Lang, but

00:23:12.210 --> 00:23:13.260
it would pull that in, right?

00:23:13.260 --> 00:23:18.990
So everything because of this, this,
this, uh, tree of hashing, uh, It would

00:23:18.990 --> 00:23:24.450
only pull in stuff that are, is actively
being referenced by that, uh, that binary,

00:23:24.540 --> 00:23:26.700
the, the, the final, the final binary.

00:23:26.705 --> 00:23:31.410
So you, you end up with very small, uh,
docker images from scratch, basically

00:23:31.410 --> 00:23:36.090
the, the equivalent, uh, as writing
your own from scratch and copying only

00:23:36.090 --> 00:23:37.860
the, the, the stuff that you would need.

00:23:38.595 --> 00:23:38.865
Raph: Yep.

00:23:39.270 --> 00:23:40.380
Lio: So that was kind of cool.

00:23:40.440 --> 00:23:44.520
Uh, not only really let me
experiment with all these utility.

00:23:45.465 --> 00:23:48.195
Yeah, it, it's, it's, it's an old website.

00:23:48.225 --> 00:23:52.365
Uh, the, the apps might have
been delisted, so it needs some

00:23:52.365 --> 00:23:57.975
love and I probably need to spend
some, some time to, to revamp it.

00:23:58.365 --> 00:24:00.105
Raph: so, so how are you gonna do that?

00:24:00.915 --> 00:24:01.695
Lio: That's a good question.

00:24:01.700 --> 00:24:04.405
Like I probably wouldn't
use D Lang anymore.

00:24:04.635 --> 00:24:05.265
Raph: No.

00:24:05.415 --> 00:24:06.795
Lio: not, not because of the language.

00:24:07.125 --> 00:24:10.575
I think the language is still being
actively developed, getting new features.

00:24:11.325 --> 00:24:14.405
Dealing is, is not well
known, but it, it's, it.

00:24:14.910 --> 00:24:17.460
A lot of the features make
it into the other languages.

00:24:17.465 --> 00:24:21.780
Like Rust has, has features that,
that started in D Lang c plus plus.

00:24:21.780 --> 00:24:24.630
The new c plus plus has
features that started in D Lang.

00:24:25.110 --> 00:24:30.180
So I, I really feel it's, it's kind of
fun having followed that language and

00:24:30.185 --> 00:24:33.120
the design and the discussions behind
the features that are being added.

00:24:33.360 --> 00:24:33.630
Raph: Yeah.

00:24:34.110 --> 00:24:35.370
Lio: It, it taught me a lot.

00:24:35.850 --> 00:24:39.210
It's just that 5g, the web
framework is, is really old right

00:24:39.210 --> 00:24:39.570
now.

00:24:40.035 --> 00:24:40.815
Raph: Yeah, their, uh,

00:24:40.860 --> 00:24:41.370
Lio: I, and I'm.

00:24:41.565 --> 00:24:42.975
Raph: a little, a little dated.

00:24:43.230 --> 00:24:44.040
Lio: it's very dated.

00:24:44.100 --> 00:24:47.740
I don't think there's a new modern
alternative, so I would probably

00:24:47.745 --> 00:24:50.220
use like a go or type script

00:24:50.565 --> 00:24:54.495
Raph: Hey, the latest, latest commit
to Vibe D was eight hours ago.

00:24:54.665 --> 00:24:55.015
So

00:24:55.715 --> 00:24:56.075
Lio: Well,

00:24:56.155 --> 00:24:56.780
Raph: maintained.

00:24:57.480 --> 00:24:58.650
I don't know how actively.

00:24:59.350 --> 00:24:59.840
Lio: Yeah.

00:25:00.310 --> 00:25:02.900
I, I, I think it is being maintained.

00:25:02.990 --> 00:25:03.170
Yeah.

00:25:03.200 --> 00:25:05.180
But I wonder how much of those are just.

00:25:05.885 --> 00:25:09.245
Fixing breakage, uh,
happening by the compiler.

00:25:09.605 --> 00:25:10.715
The compiler features are

00:25:10.715 --> 00:25:11.225
being added.

00:25:11.795 --> 00:25:14.315
Raph: it, it still hasn't
gotten to a version one.

00:25:14.345 --> 00:25:16.445
It's still at 0.9 0.6.

00:25:16.955 --> 00:25:17.525
Lio: There you go.

00:25:17.525 --> 00:25:17.885
Yeah.

00:25:18.215 --> 00:25:18.785
Not great.

00:25:19.265 --> 00:25:19.535
Raph: Yeah.

00:25:20.045 --> 00:25:23.135
Lio: So, uh, I wouldn't use
Azure Table probably as another

00:25:23.135 --> 00:25:28.415
one of those things that, that I
don't think it got any features.

00:25:29.225 --> 00:25:30.465
In fact, I, I.

00:25:31.165 --> 00:25:34.065
Considering the size of my
data set, it's not big, right?

00:25:34.335 --> 00:25:37.845
Um, because the nouns
expire after 24 hours.

00:25:38.235 --> 00:25:42.285
The number of keys that I have to
keep in memory is pretty constant.

00:25:42.555 --> 00:25:44.055
Doesn't change much.

00:25:44.385 --> 00:25:45.345
It's not very big.

00:25:45.345 --> 00:25:47.145
I could probably keep the
whole thing in memory.

00:25:47.865 --> 00:25:51.645
Uh, of course, I cannot use local
memory, right as I have multiple

00:25:51.650 --> 00:25:53.565
instances of my backend up and running.

00:25:53.985 --> 00:25:57.645
They, they need, uh, like
a consistent memory store.

00:25:58.395 --> 00:25:59.505
A consistent store,

00:25:59.745 --> 00:26:00.375
Raph: Yep.

00:26:00.645 --> 00:26:03.105
Lio: but I could probably
do it in Redis or Nats.

00:26:03.165 --> 00:26:05.025
So I would use either one of those two.

00:26:05.325 --> 00:26:05.865
Perfect.

00:26:05.895 --> 00:26:08.295
In-memory databases, I
don't need persistence.

00:26:08.685 --> 00:26:11.565
Like the, what is the worst that
can happen if I, if I lose all

00:26:11.565 --> 00:26:14.805
my instances and, and all the
keys and the values are gone,

00:26:14.875 --> 00:26:15.485
Raph: Mm-hmm.

00:26:15.855 --> 00:26:20.115
Lio: like only the active nouns would've
been affected and which are not that many.

00:26:20.265 --> 00:26:23.925
So that's probably the better architecture
as opposed to doing like a round.

00:26:24.615 --> 00:26:27.885
To a persistent database
like Azure Table, right?

00:26:27.885 --> 00:26:29.055
It's a little bit overkill.

00:26:29.595 --> 00:26:30.135
Um,

00:26:32.470 --> 00:26:36.070
Raph: Would you, you wouldn't, you
wouldn't switch to a, to a, a full,

00:26:36.070 --> 00:26:38.770
full blown front end framework with

00:26:39.385 --> 00:26:40.165
Lio: I could be tempted.

00:26:40.195 --> 00:26:41.995
No, I I actually, I would be tempted too.

00:26:42.310 --> 00:26:42.430
Raph: Yeah.

00:26:43.130 --> 00:26:44.120
What would be the value there?

00:26:44.820 --> 00:26:45.150
Lio: so,

00:26:45.315 --> 00:26:45.675
Raph: for fun?

00:26:45.855 --> 00:26:47.955
Or would there be some value?

00:26:48.570 --> 00:26:50.250
Lio: yeah, maybe, maybe just for fun to

00:26:50.445 --> 00:26:51.465
Raph: fun is valuable.

00:26:51.810 --> 00:26:55.290
Lio: To, to me, a project like
not only is perfect, uh, ground

00:26:55.290 --> 00:26:56.850
to, to experiments with, right?

00:26:56.850 --> 00:27:01.440
Like, uh, what would it look like using
View, what would it look like using React?

00:27:01.440 --> 00:27:06.450
You know, how and how do you compare,
like how do you quantify the costs

00:27:06.540 --> 00:27:11.880
and, and, and, and, uh, the value
of these, uh, of these frameworks.

00:27:12.310 --> 00:27:12.675
Raph: Yeah,

00:27:12.930 --> 00:27:13.650
Lio: So the one that.

00:27:14.350 --> 00:27:18.310
Um, the one that I personally
haven't used yet, but would love to

00:27:18.520 --> 00:27:21.790
try and maybe now only would be a
occasion to try it, it's felt kit.

00:27:22.240 --> 00:27:24.610
So maybe I, I, I would try that for now.

00:27:24.610 --> 00:27:25.510
Only 2.0.

00:27:26.350 --> 00:27:27.340
Get it out Data.

00:27:27.985 --> 00:27:28.225
Raph: Yeah.

00:27:28.925 --> 00:27:30.785
Finally remove that, that little flag.

00:27:31.485 --> 00:27:31.695
Lio: Yeah.

00:27:32.295 --> 00:27:34.065
So yeah, it's a fun little project.

00:27:34.095 --> 00:27:36.675
Um, I still use it in my presentations.

00:27:36.705 --> 00:27:38.565
Uh, there is, it has some usage.

00:27:38.865 --> 00:27:40.035
I mean, I'm not marketing it.

00:27:40.095 --> 00:27:42.585
Um, you know, if people
like it, let me know.

00:27:42.585 --> 00:27:45.325
If people think if, if it
doesn't work, let me know.

00:27:45.325 --> 00:27:48.445
If, uh, there's a feature you
would like to see, let me know.

00:27:48.475 --> 00:27:50.535
It's quite, quite fun for me to e.

00:27:51.145 --> 00:27:53.905
Raph: That's noun ly, right?

00:27:53.995 --> 00:27:57.205
Noun ly awesome.

00:27:57.370 --> 00:28:00.430
Lio: So a little, uh, Easter egg.

00:28:00.835 --> 00:28:01.195
Raph: Yeah.

00:28:01.300 --> 00:28:08.410
Lio: Uh, if you go to noun mom, m o m,
it's goes to a five video that one of my

00:28:08.410 --> 00:28:10.780
friends got me when I launched Stinky Bad.

00:28:11.140 --> 00:28:14.410
And so it still references
stinky bad, but it's hilarious.

00:28:14.415 --> 00:28:18.130
Like I, maybe I should do a ask
the same guy to do a new one.

00:28:18.790 --> 00:28:19.210
So, uh,

00:28:19.910 --> 00:28:22.470
Raph: Oops, that's my camera deciding.

00:28:22.470 --> 00:28:23.850
It has been half an hour.

00:28:24.550 --> 00:28:25.120
Alrighty.

00:28:25.150 --> 00:28:26.860
Thanks for listening.

00:28:26.865 --> 00:28:31.300
We are building projects that should
make it a lot easier for developers

00:28:31.300 --> 00:28:33.660
to build projects like Noun.ly.

00:28:34.585 --> 00:28:38.935
Lio: Yeah, check, check out Defang.io,
which is making building web apps

00:28:38.940 --> 00:28:41.055
cheaper, easier, and more resilient.

00:28:41.950 --> 00:28:45.290
Raph: And check out the
Chewy Stack at gochewy.io.

00:28:45.340 --> 00:28:49.810
A deep stack framework that helps
developers build better products faster.

00:28:50.290 --> 00:28:54.690
That's Defang defang.io.

00:28:54.690 --> 00:28:57.430
And gochewy.io.

00:28:57.430 --> 00:28:59.760
gochewy.io.

00:28:59.885 --> 00:29:04.085
Thanks again for listening, and
we'll see you on the next episode.