Episode Transcript
Transcripts are displayed as originally observed. Some content, including advertisements may have changed.
Use Ctrl + F to search
0:00
Do you find yourself for your team building
0:02
internal apps frequently for your company? Are
0:04
you familiar with the term forms over
0:06
data? They can be super empowering
0:08
for your organization, but they can also
0:11
be pretty repetitive, and you might find
0:13
yourself spending more time than you like
0:15
working on them rather than core products
0:18
and services. I've invited Jimmy
0:20
Chan from Dropbase to tell us
0:22
about their services, whose tagline is
0:24
build internal web apps with just Python.
0:27
It's a cool service and a fun conversation.
0:30
This is Talk Python to Me, episode 460 recorded March
0:32
12th, 2024. Are
0:37
you ready for your host, please? You're
0:39
listening to Michael Kennedy on Talk Python to
0:41
Me. Life from Portland, Oregon,
0:43
and this segment was made with Python.
0:50
Welcome to Talk Python to Me, a
0:52
weekly podcast on Python. This is your
0:54
host, Michael Kennedy. Follow me on Mastodon,
0:56
where I'm at M. Kennedy and
0:58
follow the podcast using at Talk Python,
1:01
both on bastodon.org. Keep
1:03
up with the show and listen to over
1:05
seven years of past episodes at talkpython.fm. We've
1:08
started streaming most of our episodes
1:10
live on YouTube. Subscribe to our
1:12
YouTube channel over at talkpython.fm slash
1:15
YouTube to get notified about upcoming
1:17
shows and be part of that
1:19
episode. This
1:21
episode is sponsored by Mail Trap, an
1:23
email delivery platform that developers love. Try
1:26
for free at mailtrap.io. And
1:29
it's brought to you by us over at
1:32
Talk Python Training. Did you know that we
1:34
have over 250 hours of Python courses? Yeah,
1:36
that's right. Check them out
1:39
at talkpython.fm slash courses. Hey,
1:42
Jimmy. Hey, Michael, how are you doing? I'm doing
1:44
well. Welcome to Talk Python to Me. Fantastic to
1:46
have you here. Thank you, I'm really excited. Yeah,
1:49
I am too. I'm right. I saw a drop
1:51
base. I saw what you all are building. That
1:53
is pretty darn interesting. And I think people will
1:55
want to check it out. So we'll
1:57
dive into this app. The
2:00
platform that you made for a building
2:02
basically I will are fun Now before
2:04
we get inside they're just give us
2:06
a acquitted could fit a backer new
2:08
South. As you get in programming and
2:10
you find yourself writing a i thought
2:12
building platform awesome Yeah I went to
2:14
school for a generic add. this was
2:16
actually backing of Canada. I studied in
2:18
Montreal at a better school com Mcgill
2:20
University. Nice we started then I used
2:22
to insert by the way as chief
2:24
company called Research in Motion by you
2:26
make Like Bears way back into time
2:28
Oh yeah awesome In. The heyday In
2:31
a day where I run around, they
2:33
said we have fifty percent of the
2:35
U S smartphone market share. But the
2:37
problem with awesome it.on Java. not privatizing
2:39
the something afterwards. Actually my Metro founder
2:41
is the Python programmer and I think
2:43
that's I've been after we start working
2:45
together cause you got any fun stories
2:47
from your time? A blackberry did you
2:50
enjoy? and how are they aware of
2:52
his eternal space? The Bauhaus mrs been
2:54
to twenty months internships at a time.
2:56
I was at a game, a third
2:58
year of school, and of. Lewis was
3:00
working on this road shower ask for
3:02
their smartphones and Smitty sure everything was
3:04
was working. The cool thing is when
3:06
you work at a company that's making
3:09
devices devices have a very long development
3:11
cycle as I imagine. Example you work
3:13
at Apple today by the I phone
3:15
but fifty of was on what's coming
3:17
next with the been working on it
3:19
for at least a year probably longer
3:21
to get access to all these like
3:23
are times I became you get to
3:25
use cause like you're building for your
3:27
testing at my was a really nice
3:30
nice. Nice day but you can tell anybody
3:32
about but it was really cool to now
3:34
that you're on the last thing. you couldn't
3:36
lose it in a bar or anything like
3:38
that right at the remember those stories right?
3:40
Yeah, exactly easy to find somebody. got hold
3:42
of a last phone and it was sold
3:44
and there's all sorts of drama is a
3:47
big deal. I was around I phone for
3:49
three four five sorta timeframe. Yeah, I'm a
3:51
middleweight, a clear and yeah sucker sailed from
3:53
didn't want to be that you wanted to
3:55
make sure he hung onto our your skin.
3:57
Is that as a yeah I think work.
4:00
Copyright That would have been awesome at least
4:02
in the heyday. You know it's cooler work
4:04
for a tech company that's gotta lotta when
4:06
that it's back and lot of people use
4:08
and as it's. Can. Any of their
4:11
Ip we had a lot of our
4:13
it other concerns have a higher at
4:15
the time be set a blast work
4:17
in their over the summer here. Lot
4:20
of excited people the to do stuff.
4:22
Excellent course and so didn't you picked
4:24
up Python. Get me started. This project
4:26
is arranged so little bit before it
4:28
so when we started our start up
4:31
this was back every twenty twenty. Michael
4:33
founder has been using Python. He did
4:35
a master's degree computer science focus on
4:37
Mr. Varney solely in a fields Python.
4:40
Is is really bad. the main language
4:42
you use yeah this and said with
4:44
us are familiar with it and so
4:46
he said are stuck with me to
4:48
be a python or past them back
4:50
and and then just through that process
4:52
just looking a phase and designing features
4:54
a keys which is all about about
4:56
the pilot so he can it just
4:58
became the same Answer is actually the
5:00
recent are working on on a tight
5:02
the builder is were kind of building
5:05
upon ourselves the something where states are
5:07
oh nice that were for their mental
5:09
models so that's. Pretty much it out.
5:11
Today today I spent a lifetime
5:13
building apps with Drop A So
5:15
Eternal To and that's most of
5:17
the outbuilding I do now. Seven
5:19
filling demos, testing the products and
5:21
medishare everything is working and then
5:23
says finding other ways to make
5:25
the developer experience more convenient. It
5:27
seems like something you could really
5:29
take care of. bunch of internal
5:31
automation app of apps you know
5:33
done your have their grief for
5:35
on web apps and secret I
5:37
insisted or get that dashboard her
5:39
or whatever. A just by are
5:41
viewing platform and when a few
5:43
days sources that's right. Yeah so
5:45
the big difference with other frameworks
5:47
right? is that like you going
5:50
to use these frameworks to build
5:52
your customer facing applications as customers
5:54
they are high expectations about what
5:56
they need. Interactions sometimes make a
5:58
big difference for them. You
6:00
I components the way models come on.
6:02
it's all part of the spirit. It's
6:04
an answer for that. You really need
6:07
a lot of extra components. complexity. Thea
6:09
for eternal tools. It is not to
6:11
say that's eternal. Users don't have high
6:13
expectations, but the kinds of things are
6:16
you do with those tools and to
6:18
be very similar, he searched for data
6:20
you get context about that summers off.
6:22
Research for a transaction are for a
6:25
user. because I'm a context. Make sure
6:27
that that's the user, the transaction that
6:29
you. Want often and then you act
6:31
on or I like you you trigger
6:34
an action on that I them were
6:36
that resource. Yeah with up or isn't
6:38
it helps you simplify the kind of
6:40
things you need. Answer for that: Having
6:43
a framework of a builder make this
6:45
happen. A super convenient. The subtitle catchphrase
6:47
of.basis build internal web apps with just
6:49
Python is awesome. And when I think
6:51
of internal web apps or even traditionally
6:54
if you look back a ways that
6:56
was be be six in Windows forms
6:58
of those types of things. That were
7:00
kind of play in the same role.
7:02
so the same same basic idea. Who
7:04
is a lot of people who referred
7:06
to that as forms over data? A
7:09
kind of that's not why a negative
7:11
term. What? Kind of like we're sorta
7:13
doing the same basic architecture over and
7:15
over, but it's a different problem every
7:17
time and so exciting at a rate.
7:19
Codes freebies project from scratch every time,
7:21
but there for the kinder, same kind
7:23
of thing. And so yeah, I think
7:25
that's probably why Bbc Six with it's
7:27
kind of visual drag and drop be.
7:30
experience with camera popular cause you could
7:32
drag a table on their dragon data
7:34
source blinded to that make a button
7:36
click on some a touch of this
7:38
thing and it didn't create something that
7:40
would rival say air bnb.com or where
7:42
you are these really dynamic design sides
7:44
but that's not what they needed that
7:47
companies as work we need this week
7:49
i need our sales people to be
7:51
able to answer this question and make
7:53
this change that's what we need you
7:55
to build this we get if is
7:57
from scratch every time that's it of
8:00
rework. It's a lot of work. It's funny
8:02
you mentioned the forms over data. It is
8:04
true that a lot of the, well, if
8:07
you take it at a very high level, all
8:09
apps are forms over data. All
8:12
SaaS apps are forms over
8:15
a database in some sense.
8:18
And then you start to hear
8:20
also about the similar things with,
8:22
you've heard about the GPT wrappers,
8:24
right? It's the same concept where
8:26
it's like an over simplification of
8:29
what's happening, but at the same
8:31
time, it is kind of core to
8:33
what's happening. And for internal tooling at
8:35
least, it's exactly what you need, forms
8:37
over data, but very quickly so that
8:40
developers don't have to spend a lot
8:42
of time basically doing the same things
8:44
over and over again, you want to
8:46
make their lives easier to support their
8:48
internal users. So people in customer support
8:50
operations, and I think sometimes
8:52
even supporting other engineers as well. Yeah,
8:55
and it's not that people in companies
8:57
don't have expectations of nice apps and
8:59
nice interactions. It's just that it's more
9:01
utilitarian. Like so many of these big
9:04
enterprises, when you kind of think of
9:06
them, maybe the right way to think
9:08
of them is there's a massive Postgres
9:10
or Microsoft SQL Server at the center.
9:12
And like, it almost connects the
9:14
business division like the sales team and
9:16
the marketing team and the, you know,
9:18
the product team and all that. And
9:20
it's if you can get into the
9:23
database and, you know, answer questions, expose
9:26
data, expose relationships, give put a UI
9:28
to some aspect of that, you're
9:30
really right at the heart of the
9:32
company and in some sense, you know,
9:34
it's definitely about effectiveness. One
9:36
way we think about what these kinds of tools
9:39
should do, you have to enable
9:41
developers to very quickly build
9:43
apps that have maximal value that lets
9:45
you get the job done as effectively
9:48
as possible. But also that easy to
9:50
use for the end user. So you
9:52
know, it's like a business operator, someone
9:54
the operations team, they also need to
9:57
be able to learn quickly how to
9:59
use it. and trigger actions.
10:01
And so we call that sort
10:04
of effectiveness of the apps, some
10:06
sort of like effectiveness score. It just combines
10:08
these components. And that's really
10:10
the, like if you can get to the
10:13
essence of it and create a framework or
10:15
a tool builder that maximizes for that, I
10:17
think you're in a really good place. It
10:19
is something we're trying to do with DropBase.
10:22
The components are simple. The
10:24
kinds of apps that you can build
10:26
look roughly the same, but they look
10:28
really nice. And they're also quite simple
10:31
to understand. They're modeled after attributes in
10:33
a way where you have data,
10:35
grid or table in the middle. And then there's
10:37
a sidebar from where you can trigger actions. And
10:40
this comes back to this concept of,
10:42
when you ask people in operations, what
10:44
they do, like sales, marketing, business operations,
10:47
essentially it ties back to the previous
10:49
comments, which was you search for something,
10:51
you get context about it and you
10:53
trigger action. And so the way we
10:55
translated that insight about what people just
10:58
end up doing over and over again,
11:00
we said, well, then you really just need
11:02
some sort of search bar, you need a
11:04
grid, and you need a sidebar
11:06
with some buttons or some other dropdowns and
11:08
other components. And then you realize, okay, this
11:11
is kind of what spreadsheets have been trying
11:13
to do for a long time. Yeah, that's
11:15
true. Except we like to trigger
11:17
their actions. Yeah, people do oddly connect Excel
11:19
to like external data sources and all sorts of
11:21
weird things as well. Or
11:23
write VBA that makes them change. They probably should just
11:26
not be doing that. Yeah, there's a lot of, it's
11:28
actually a big use case. On our previous
11:30
product, we actually did exactly that. We
11:33
let you connect any database
11:35
source to your Google Sheets and
11:37
just kind of run that on a
11:39
schedule. So you'd imagine in a business
11:41
setting, you have sort
11:44
of these like weekly daily reports that
11:46
analysts end up working on, right? And
11:49
what you want is for the data to
11:51
be fresh, up to date. And so people
11:53
just wanted a way to, at
11:56
7 a.m., 8 a.m. on Monday morning,
11:58
basically automatically pull data. from a database,
12:00
load it up to your spreadsheet, and
12:03
then all your tables and calculations, which
12:05
is sort of updated, because they're referencing
12:07
a tab, a sheet, basically, that
12:09
has fresh data. It is very interesting, the
12:11
evolution of all these tools. It is really
12:14
interesting. Maybe one of the
12:16
big differences is the interactivity here versus
12:19
what you might do in that
12:21
story, right? That's read-only, really. And
12:23
then here, what we're doing is
12:25
letting you trigger actions, perform actions,
12:27
basically outside the app. So
12:29
you might call an API, or you might
12:31
trigger an internal endpoint, or
12:34
just some triggers matching in the UI. This
12:37
portion of TalkBython.me is brought to
12:40
you by Mailtrap, an email delivery
12:42
platform that developers love, an
12:45
email sending solution with industry-best
12:47
analytics, SMTP, and email
12:49
API SDKs for major programming
12:51
languages, and 24-7 human support.
12:56
Try for free at mailtrap.io.
13:00
I think we'll get to this more later, but I want
13:02
to maybe touch on since there's a good question and also
13:04
it might be a question a lot of
13:06
people have. So what's the pricing model for this? And
13:09
basically, more broadly, what is the
13:11
business model around here? Luis says,
13:14
already amazed by it, would like
13:16
to compare it. For
13:18
a start, there's nothing like this
13:20
available in open source, so very
13:22
neat. The business model is we're
13:24
going to sell the product on
13:26
a per user per month basis.
13:28
So it's a B2B SaaS app
13:31
product. Now, developers need
13:33
to be able to play around with
13:35
products before they can decide whether that's
13:37
something they want. And so
13:39
we have a free version
13:42
of the product that you can set
13:44
up locally, like in your own machine, or you
13:46
can just put it up on an EC2, and
13:49
you can just build apps for yourself. If
13:51
you want to automate personal tasks, you can
13:53
totally use this for it. And then the
13:55
way that we, in a way, layer the
13:58
pricing is, very
14:00
complex permission systems. So like you build
14:02
an app and you want it accessible
14:04
by this person, by person A, but
14:06
not person B, then you'll
14:08
need very granular permission systems. And so that's an
14:10
indicator that you're probably like a, you know,
14:12
like a corporate user, you're a business user. And
14:15
so we do the pricing based on that. The
14:17
source is open, at least people can
14:19
go and check it out, right? Is that
14:22
true? Let me clarify that. So you can self-host it.
14:24
Yes. You know, you can look
14:26
at the repo. Behind the scenes, it's a
14:28
Docker image that
14:30
you set. So the code for drop
14:32
base is not immediately, you know, you
14:35
can't just browse it through the file
14:37
system, but the code is basically sitting
14:39
in your machine when you set this
14:41
up locally. Now the difference here is
14:43
if you look at the directory where
14:45
you have the workspace. So the workspace
14:48
directory is where all your apps' files
14:50
would be generated as you build the
14:52
apps. Okay. That's really nice
14:54
because you can essentially version control this
14:56
from day one. You can build
14:59
apps, you can check it in GitHub. You can
15:01
just keep your code, you can version it. And
15:03
so it's really, it's all
15:05
open source. It's clarified that, but
15:07
you can self-host it. It's on
15:09
GitHub, but the licensing is really
15:11
not like just straight up GPL
15:13
open source type of thing, right?
15:15
That's correct. Yes. Okay.
15:18
And it's on GitHub because you need to, you do need
15:20
to clone the repo and then you need to send it
15:22
out and install it. The free tier doesn't allow self-hosting, but
15:24
if you pay for some, one of
15:26
the versions, then it does have a
15:28
self-hosting option. So when you just
15:31
to wrap this up on the price,
15:33
when you say it's $10 per user
15:35
per month, is that per person that
15:37
makes the project, that builds the apps
15:39
or is that per person that interacts
15:42
with the web app? This is currently
15:44
per member of your workspace. So we're
15:46
not yet differentiating between someone who is
15:48
building the app or using the app.
15:50
Although that might be something that we'll
15:52
have to add later on. Sure. We
15:55
had say four salespeople and one
15:58
developer in quotes, maybe. Weber
16:00
dowdy five users under this story corrects
16:02
under the current by Judah. Okay yeah,
16:04
even if it's not, just tear up
16:06
the source taken, run with it. I
16:09
do like the self hosting aspect of
16:11
it because if you've got private data
16:13
or maybe even more important than any
16:15
of that is I want to connect
16:17
it tude data sources that are and
16:20
want to give your cloud access to
16:22
my company database for example I could
16:24
expand on that us with so we
16:26
built this specifically with that comments in
16:28
in my innocent so. When you're
16:31
using infernal tools, it's very more
16:33
the say. It's almost all the
16:35
cases you are interacting with production.
16:37
At least one production database were
16:39
elected. You're supporting customers and your
16:42
issuing them unrefined. You don't do
16:44
that In has an executive Staging
16:46
in Detroit is it's you. Basically
16:48
you act on it on your
16:50
production data and so we thought.
16:52
okay people are probably going to
16:55
be very hesitant to to basically
16:57
say let me lot of all
16:59
my threads. Are my if he
17:01
I t into some me a player
17:03
and new class of and then like
17:05
hope for the best right? So when
17:08
we designed Drop Base and we call
17:10
it a worker or the workers server
17:12
the way you connect to data sources
17:14
he is. You basically go see your.e
17:16
M B file and he just add
17:18
your database france and that yeah me
17:20
fall fits in the same directory that
17:22
that workspace are accurate, sits and I
17:24
want to. We see where we saw
17:27
it on Get Help and that's completely
17:29
on your side. And that's in
17:31
your the to see or your
17:33
local machine and the same server
17:35
is the one that rigorous the
17:38
task is to query your database
17:40
fell in that office sitting on
17:42
your side in your and seen
17:44
as will be fired. far of
17:47
the product that processes queries, touches
17:49
your data, your data sources your
17:51
credentials that's completely on the user
17:53
side and the the only for
17:56
that we manage is really just
17:58
have permission system so. That
18:00
control your workspace actually be like the
18:02
app permissions. that's the layer that the
18:04
week true and that's really liked the
18:06
part where we can do the pricing
18:08
on to be a mistake of stuff
18:10
that's a feature set. That thing that
18:12
helps with say okay disagree dummy pill
18:14
customers on these are going to be
18:16
developers were just gonna learn how to
18:18
cope with python is one of built
18:20
little apps for that for their own
18:22
personal use. My them a sense let's
18:24
me We talk through an example I
18:27
will see go to Debase and I
18:29
are There's a. Ride the Top is
18:31
it sorta tutorial on our demo video of
18:33
a views in it I was. I don't
18:35
want to play the video that maybe just
18:37
August through the steps of a what this
18:40
app is and mortar the steps to build
18:42
it and just from people who are or
18:44
listen and watch the video. maybe as he
18:46
has twelve minutes long and you're like let's
18:49
create a new project and here it is
18:51
published at the end right which is really
18:53
nice say as August or I mean add
18:55
try to recreate the exact same one That
18:57
said you have on the on the screenwriter
19:00
it looks like an app that has two
19:02
tables and stuff you can somehow perform an
19:04
action with on the sidebar. Basically it's as
19:06
notifies either notifies a user or he performed
19:08
some sort of emissions. Think what this one
19:11
does is it has our work spaces and
19:13
then users in a workspace and you can
19:15
make them admins or not admins of that
19:17
work spaces. The ones that gotcha that how
19:20
perfect rocket or yes I'll I'll describe how
19:22
you build it up. So you go through
19:24
our up studio and it's gonna be a
19:26
blank canvas in that canvas you can add
19:28
tables for the first and you do is
19:31
you add table one yeah the for a
19:33
table as and do it at table to
19:35
which is the second table and then you
19:37
add a widgets.on the sidebar you just click
19:40
on add bunny and then just placed a
19:42
button on the screen for you. Well be
19:44
sort of a shell of the application will
19:46
be just to stay dry part. at this
19:48
point it's just a few mouse clicks. There's
19:51
no can scrub cold or packing to but
19:53
you're writing. The next step is to add
19:55
birds of the logic behind the scenes. The
19:57
first thing we need to do is to.
20:00
Populate the first table with data about
20:02
your work spaces and essentially what we
20:04
do is you please click on create
20:06
new you Korea new function as a
20:08
not constantly to be a sequel function
20:10
or a python function because our sister
20:12
table he could just create a new
20:14
sequel function. So you do Korean you
20:16
function collect everything from work spaces the
20:18
see that's the table and as you
20:20
can see a lot of preview of
20:22
what that select state may were with
20:24
salt and so you can verify that
20:26
that's been added. You want to shop
20:28
and once you've done. That just say
20:31
that guy who had query and
20:33
you do something we called binding
20:35
Fill in the you eyes you
20:37
can select people once and for
20:39
censor with the tables properties and
20:41
one of the property is with
20:43
sequel file which legal script hitting
20:45
balance you are you squeak by
20:48
into a single father just row
20:50
and then it is automatically populated
20:52
with data were your workspace Now
20:54
the second see It was a
20:56
little bit more interesting because the
20:58
second syllable will update depending. On
21:00
what role you've selected in the first
21:02
people. When you click on a workspace
21:05
in the first people it'll be shit
21:07
Load all of the users and are
21:09
part of a particular workspace and so
21:11
we do this. We have a future
21:13
call dependent tables and that's exactly where
21:15
does so for the second table he
21:18
was still write a sequel query and
21:20
a query would just say select everything
21:22
from users were the whispers I'd be
21:24
is the selected row Work this idea
21:26
from the first people and you will
21:29
you. Since About Ginger. Much or maybe
21:31
the audience will be familiar with into
21:33
a sort of like ginger templating style
21:35
where he says like everything from
21:37
users were were false Id is he
21:40
a double cheney brace and then we
21:42
have something call states Baby Sweet gives
21:44
you the state of the you
21:46
I have any point in time and
21:49
click something and it's for the we
21:51
made any to class of be can
21:53
say the state.tables.table one dot. Much
21:55
as Id we resolve that into the
21:58
value. that's that's what's that. What
22:00
was I the from the first cable s
22:02
oh that's too many do the same for
22:04
you say flat stucco query you buy me
22:06
to the site and table and then we
22:08
are not me A for that whenever you
22:10
need he was you whenever you like to
22:12
the front row in the first able to
22:14
second table will update the which is id
22:17
value rerun the query and they showed you
22:19
the data with as go I was wondering
22:21
how that happened I thought you my satellite
22:23
wire some on change of and consumer here
22:25
than in trying to your that these have
22:27
that all automatically be you I actually knows
22:29
that a which. Tables are related but
22:31
you i sense a payload to the
22:33
back and saying the stable was clicks
22:35
and this other team of it's related
22:38
sweat and so we kind of know
22:40
that we need to process again as
22:42
so that's how we do this dependency
22:44
evil or the getting the the value
22:46
of they work for his Id in
22:49
the first cable we basically we resolve
22:51
be a be available in the back
22:53
and and then passive value. for that
22:55
we can update the queer lawsuit as
22:57
if you stop at that point. In
23:00
a you say premium bf the app
23:02
would look like two tables were is
23:04
really just let's see all the users
23:07
for each workspace. that's the you have
23:09
your in a database and then a
23:11
few more things to make that very
23:13
useful If you might want to spend
23:15
my workspace before you know who to
23:17
support. Solas A plus a workspace is
23:20
associated with one of your customers. Oh
23:22
miss a company age or customer. The
23:24
company a gives you a cause a
23:26
poor call and says hey could you
23:28
make John in our. company and admin
23:30
for the first and you wanna do
23:33
you want to find the source for
23:35
company a and then fine job so
23:37
we have is nice feature that basically
23:39
automatically creates searches for you some of
23:41
the same the first table you can
23:43
click on a been to convert it
23:45
to a smart people and when you
23:47
do that we miss the generates dancers
23:49
for you so you can then to
23:52
say i'd like to search by company
23:54
name and you can select the saucer
23:56
and you can tend to censor into
23:58
the table and that automatically performs
24:00
the search for you. So it's just pretty
24:02
neat that way. It reminds me a little
24:04
bit of Notion. Notion tables. I don't know
24:06
if you play with Notion any. Yes. You
24:08
know, you've got those pin swords and those
24:10
pin filters and different things you kind of
24:13
put at the top of the, I guess,
24:15
their database. Is it called a Notion? A
24:17
little like that. It's very similar to that
24:19
in the sense that you're not writing any
24:21
code to be able to search through tables
24:23
but you can still modify what you let
24:25
people search by pinning certain filters. The really
24:27
interesting thing that we've done here is that
24:30
we let you do joins and
24:33
still provides you that feature. So in Notion,
24:35
for example, you would just have one database
24:37
and you can filter and sort that database.
24:40
With drop base, what we have is, let's
24:42
say you have a table called users and
24:44
a table called roles and
24:46
then they're related by an ID
24:48
where let's say ID1 is users,
24:51
ID2 is developers, ID3
24:53
is admins. You might have to join
24:55
those two tables first. And so that
24:57
same smart feature, smart table feature, you
25:00
can just write that SQL statement, join statements
25:02
and we can still generate sort of the
25:04
right filters for you. And we'll actually let
25:07
you edit those tables as well. What
25:09
we do is we take your SQL
25:12
statement and then we infer all the
25:14
SQL required to search or edit any
25:16
column within the SQL statement. That sounds
25:18
awesome. That's a really neat feature especially
25:21
for the people who are used to
25:23
using something like Django admin in
25:26
the sense that it helps you
25:28
very quickly build an admin panel
25:30
with very little developer work. You can
25:32
just write a SQL statement and then
25:35
we give you an admin panel. So
25:37
that's really neat. But the final thing
25:39
with the app here in the demo
25:41
is the little button on the right
25:44
side. That is a Python function. So
25:46
you create a new Python function and
25:48
you essentially say, you essentially write a
25:51
database update to update the role from
25:53
whatever it was, let's say from developer
25:55
to an admin. So it's just really
25:57
a select statement, you know, updates. table
26:00
that column something on this particular ID. And
26:02
so that's just a Python function. And the
26:04
final thing is just to connect that button
26:06
to run this Python function. So you click
26:08
on the button, we run the function, and
26:10
then we perform a database update to update
26:12
the role to whichever role you want. And
26:14
that really is just the gist of the,
26:17
of the done. So a couple of things
26:19
about that Python function, that's pretty interesting. When
26:21
you create it, you can say, I want
26:23
to create a function and it says, do
26:25
you want SQL or do you want Python,
26:27
which is pretty interesting. The Python
26:30
function has access to the UI widgets,
26:32
like it in the actual video, not
26:34
the screenshot of the video. I think
26:36
you've got a dropdown select box. And
26:39
so the Python function go, well, what
26:41
did the user select? And then we'll
26:43
make the change to the person in
26:45
the workspace along those lines. So that's
26:47
pretty cool, right? That you interact with
26:49
this UI and kind of a object
26:51
oriented way, I suppose. That's exactly how
26:53
it works. So behind the scenes, we
26:55
have two classes. One is called state
26:57
and one is called a context. So
27:00
the state class does let's us
27:02
access all of the UI state
27:04
at any point in time. Anything
27:06
you enter in an input component
27:08
or any row you select in
27:11
a table, you can see the
27:13
currently selected values of it. And
27:15
so whenever you click on a
27:17
button or you perform an action,
27:19
that state is passed
27:21
to the backend, just with a payload,
27:24
just like a dictionary. And the backend,
27:26
we generally all the classes, all the
27:28
objects related to state and
27:30
context, so we just have to pass
27:33
the values in and then execute the
27:35
function with those values as the input.
27:37
And so that's how we're able to
27:39
do the state thing with Python. If
27:41
you've seen how you would do it
27:43
in Python, it is very much a
27:45
dot notation, right? So you would say
27:47
to get the value of column one
27:49
in table one, you basically just say
27:51
state dot tables, which gives
27:53
you all the tables, dot table one, Dot
27:56
column one, and that basically
27:58
resolves in. The you devalue off
28:01
the table of the role in that
28:03
table for that call our school. I
28:05
can imagine the implementation of that thing
28:07
is like.at Dunder get get outturn if
28:09
you ask for the thing you can
28:12
the dictionary interests thing and put the
28:14
with that mind. What I thought was
28:16
really nice about this is you add
28:18
pretty decent on a complete and you're
28:20
pro embedded python editor. How audible I
28:22
did you notice? yeah we spend our
28:24
time on is that I bet you
28:27
did That has that we're we're designing.
28:29
It is worth. And gave them vs
28:31
notice really nice. Yeah it's all the
28:33
plugins, all the article sweet and every
28:35
day by we have two choices right?
28:37
Either we built this whole you i
28:39
build into the a coat or we'd
28:41
find out take some other things I
28:43
may just code grade and then bring
28:45
it into the job a studio we
28:47
don't Also the fine I'll eventually why
28:49
this will be but the current version
28:51
of this is we thought the on
28:53
I speak we need to give users
28:56
an editor like a built in editor
28:58
for they can just quickly become the
29:00
best experience. Building the app and
29:02
be assisting why and concepts and
29:04
state really quickly when we just
29:07
wish that about way where we
29:09
added a in alice be so
29:11
I got my were server. So
29:13
anytime side code and your Python
29:16
function is basically over a web
29:18
socket connection, basically streaming and the
29:20
code changes and saving them in
29:23
your file system. that's the only
29:25
way we can do this. Decide:
29:27
Object Oriented Python.notation Axis. And
29:29
so we the topic due to the too
29:31
fast so we set this up so that
29:33
normally and you can do on a complete
29:35
but also that we can actually do the
29:38
feeling conflicts approach to the web framework. It
29:40
was a bit complicated because we haven't been
29:42
really exposed to our species for as we
29:44
have to learn how to use our species
29:46
and we have to sort of i jackson
29:48
of be so that the web socket connection
29:50
in a way so that we intercept the
29:52
code and then wrists we save it is
29:54
your house with them and we have to
29:57
customize the the limits you to do this.
29:59
As. With. because now you can
30:01
do autocomplete for your files. It's
30:03
just a need. It's so hard to
30:05
develop now. We're so used to these
30:07
tools. And now with things like copilot,
30:09
like we're used to even more than
30:11
just autocomplete, right? It's like autocomplete the
30:13
function, not just the variable, right? I
30:15
feel like autocomplete is just table stakes,
30:18
you know, especially in this kind of
30:20
thing. You know, there's somebody who's just
30:22
done Python forever, and they're just, they'd
30:24
rather get it out of the way.
30:26
And it's fine. It's not my way
30:28
of working, but it's fine for people
30:30
who want to do that. But if you're
30:32
working with somebody who might not be a
30:34
full time developer, but they want to use
30:36
your framework, your service to build some app,
30:38
it seems like this could really empower them.
30:41
But if you give them something with zero
30:43
autocomplete, zero highlighting, they're going to be having
30:45
a rough time, you know? Yeah, even for
30:47
a more experienced developer, I think it's definitely
30:49
still a hard time. Even if you can
30:51
do it, it's just less productive to go
30:54
like, oh, yeah, way less productive. Yeah, way
30:56
less productive. I think AI gets added to
30:58
apps a lot, just to kind of check
31:00
a box. But the result of it is
31:02
not that great to get on my email
31:04
client that has AI integrated.
31:06
But it almost always seems like, well, that's not
31:09
something I'd, yeah, something I want to read, like,
31:11
I don't really want to read that. And I
31:13
know, it's, I don't need to summarize it as
31:15
emails, you know, just seems like a lot of
31:17
energy goes into it when it's not that big
31:19
of a value, but maybe something like Copilot could
31:21
be here. This is something we've talked about me
31:23
and my co founder. So one of the things
31:25
that we didn't get to cover, because we, you
31:27
know, we're not going to go through all the
31:29
demos, but the way that we render
31:31
data in these tables is we
31:34
basically format it as a pandas data
31:36
frame. Okay. So what that means is
31:39
that let's say that you theory
31:41
data from Stripe, like you, you get all
31:43
your customers from Stripe, Stripe is not going
31:45
to return a data frame for you, it's
31:48
going to return like an object, right? Dictionary.
31:50
And then you basically have to take that
31:52
dictionary, and then basically convert it into a
31:54
data frame. And then we automatically know how
31:56
to render everything else from there. So we've
31:59
thought about this in a Wouldn't it be
32:01
cool if as soon as you get
32:03
the response from an endpoint, let's say
32:05
as a JSON dictionary, that we suggest
32:07
that we can just take it out
32:09
next step for you, which
32:11
is just to convert it into a data
32:13
frame, and then you wouldn't have to hustle
32:16
with it. We've done that with a bet.
32:18
In theory, that sounds very helpful. If you're
32:20
proficient in pandas and using data frames, it's
32:22
actually not that hard. It's a very quick
32:24
thing for you. If you
32:26
just know Python but not exposed
32:29
to the whole data frame ecosystem,
32:31
then maybe it would be really nice if
32:33
you just said, okay, we just
32:35
turn it to data frames for you, and then that's all you
32:37
have to care about. We've thought about this.
32:39
We haven't added this yet. I think it's fine
32:41
without. It's kind of one of those things, like
32:44
you're in there and you've got these data sources, and maybe
32:46
you're not super familiar with them. Maybe you can pull them
32:48
together somehow. One of the things that I find myself struggling
32:50
with is, let's say I want to build a demo. If
32:53
I say I haven't been exposed to the
32:55
SendGrid API or the HubSpot API, then
32:58
I have to go to their documentation
33:00
to figure out what's the package name
33:02
so I can install it, how do
33:05
I authenticate in, how do
33:07
I call a few endpoints to do what I need to do. I
33:10
think in that case, it's all about your
33:12
knowledge of Python. It really is about your
33:14
knowledge of this other thing that you're using.
33:16
In those cases, it seems that it could
33:19
be extremely helpful for someone to build apps
33:21
very quickly if they somehow had access to
33:23
either a quick documentation or just
33:25
suggest that what you might want to do. Yeah,
33:28
that's kind of what I was thinking as well. If
33:31
you're a regular listener of the podcast, you've
33:33
surely heard about TalkPython's online courses, but have
33:35
you had a chance to try them out?
33:38
No matter the level you're looking for, we have a
33:41
course for you. Our Python for Absolute Beginners
33:43
is like an introduction to Python plus that
33:45
first-year computer science course that you never took.
33:48
Our data-driven web app courses build
33:50
a full pypi.org clone along with
33:52
you right on the screen. And
33:55
we even have a few courses to dip your toe in
33:57
with. See what we have to
33:59
offer at training.talkcoin.com. python.fm or just click the
34:01
link in your podcast better. So
34:05
speaking of that sort of external
34:07
resources, you've got this python function and
34:09
what can I put in there? Can
34:11
I use external packages? Can I call
34:13
out on the network to talk to
34:15
some API endpoints? I
34:18
spin up threads like what can I do? How
34:21
much python can I do there? Pretty much all
34:23
of the above. So I'll elaborate what I mean
34:26
by that. So the standard way that you would
34:28
connect to some of these
34:30
services, the third party services is
34:32
you'll make like an HTTP request,
34:34
like get requests, post requests. So you
34:36
can just like import requests, basically it
34:38
could install a request and then just
34:41
do it over the standard Python, basically
34:43
Python package. Now it is way more
34:46
convenient when you use an SDK provided
34:48
by one of these third parties. So
34:50
if you want to use Stripe, if
34:52
you're able to just import Stripe, it'll
34:55
make your life a lot easier, very
34:57
nicely Pythonic, everything set up. So in
34:59
drop base, you can install anything that
35:01
you can install via PyPIA. We have
35:04
a file called custom requirements.
35:07
And if you just list them out,
35:09
when you set up drop base, we'll
35:11
basically install all those for you. And
35:13
then when you write a function, you
35:15
can just basically import Stripe directly into
35:17
function without, you know, keep installing it
35:19
again. And then you just use it.
35:21
So that's really nice. Basically anything, I
35:23
think you were doing a previous UV.
35:25
You were talking. Yeah, yeah. I was
35:27
talking to Charlie Marsh about UV earlier
35:29
today. Yeah. We haven't looked into it
35:31
yet, but anything you can install from,
35:33
you know, from PyPI, you can install intro
35:35
base, which makes it really, really powerful. Yeah.
35:37
Nice. There's a database connections. I mean, you
35:39
could use SQL, Alchemy, or you can import
35:42
whatever else you want. But we make those
35:44
a bit more native because we
35:46
know that you're going to connect to databases. So
35:48
we want to make it a bit more a
35:50
convenience. So. And your tables need
35:52
sort of direct access to it as well,
35:54
right? Not just the output of some access
35:56
to the database, but you've got to figure
35:59
out the columns. and all that kind of
36:01
stuff, right? That's correct. So we
36:03
created a little library, like a
36:06
utility slash helper, that lets you
36:08
perform database operations very quickly. So
36:10
if you've added your database credentials
36:13
to the .env file,
36:15
then you can quickly perform a
36:18
select statement or make an
36:20
update to that database via functions. But
36:22
without the standard thing where you
36:25
do if you use SQL offering, for example,
36:27
where you start a section, start a connection,
36:29
all those steps, we kind of abstract that
36:31
for you. But you can totally use SQL
36:34
alchemy in its full glory if
36:36
that's what you're used to. Nice. Can I write
36:38
Python files, like separate Python scripts and stuff, and
36:41
then just import and call them from there? Or
36:43
does it have to be done through the UI?
36:45
Totally. There's actually one of the biggest advantages of
36:48
drop base is that if you have a
36:50
Python script lying around and you want to
36:52
use it in drop base, you can add
36:55
it to that file system somewhere in the
36:57
workspace directory. And you can just import
36:59
it in via your function. So use
37:01
like from your file, you can import
37:04
a specific function in that file, for
37:06
example. And so the implication of this
37:08
is that you can set up drop
37:10
base in a way that it just
37:12
lives in your existing Python code base.
37:14
So imagine you've already set up your
37:16
company, you've
37:18
got product market fit, things are running,
37:20
and you have a Python back end. And
37:22
now you're starting to scale and
37:25
you need to build tools. So your
37:27
first option would be to do all
37:29
custom, obviously. The second option is to
37:31
use some sort of tools builder. But
37:34
every single action you take is
37:36
done over an HTTP request with
37:38
authentication with everything. So just like
37:40
a standard internet communication. But if
37:43
you wanted to just interact with
37:45
an existing functions or internal endpoints,
37:47
then you'd have to either set
37:49
up an RPC server, or
37:51
you might want to use some other way to get
37:53
in there. With Drop Base, You
37:56
basically just set up drop base in
37:58
the same directory as your app. And
38:00
you can import selectively what song says
38:02
you need a sort of like a
38:04
window. it's your code base that is
38:06
like a plugin to that how base
38:08
where you can now expanding build a
38:10
lot of tools that leverages everything that
38:12
you've already done. Yeah let's say by
38:14
the way that when you've got all
38:16
the others requirements I customary to you
38:18
got your docker compose file mean could
38:20
use said of the so as you
38:22
build it even better just said of
38:24
a volume so that it can directly
38:26
find them. Agatha so you kind of
38:28
show and I hear. Right is that
38:30
you can sort of map mouth volume
38:32
just directly in to say you're get
38:34
repo for your big project code and
38:37
the you could start importing that and
38:39
doing stuff with it right? We still
38:41
need to some tweaks because of birth
38:43
of routed Sats but they the and
38:45
you can do with a little bit
38:47
of a little bit of customization. but
38:49
but yeah Fireworks Racer! basically your mouth
38:51
files or directories and then we can
38:53
look into those two to execute bad
38:55
manners. As far as with get her
38:57
some like that a good example of
38:59
this is a. You familiar with Janko
39:01
and Jangle Admin? Not super as the
39:03
idea of in a bind Mercer Tango.
39:05
It's a great the It's a great
39:07
web framework is used by a lot
39:10
of companies. It's like if you want
39:12
to be a web apps these Janko.
39:14
He comes to the lot of stuff
39:16
and there's this thing called Jagger Admin
39:18
that basically automatically generates admin panel square
39:20
you based on your Jangle models as
39:23
a gallon model or by it's a
39:25
bug spray in the book as authors
39:27
it squeaks doses that to the Jaguar.
39:29
Been. And the now you can edit
39:31
it's a book with are really doing anything
39:34
like it all kind of comes for free
39:36
like it's pretty neat. I think that's
39:38
like a half the appeal a zinger right
39:40
there in as he i think a
39:42
lot of people use it for that. yeah
39:44
that I got all right us of amusing
39:47
Go yeah for real and it's great
39:49
now at some points and was young. When
39:51
your company gets us or new milestone or
39:53
is spent the sun a number of
39:55
of customers you will need to customize knows
39:58
I'm in panels you might need to for
40:00
it. I'm in kennels for thing for
40:02
you. Maybe you don't have models for yes
40:04
or for things that are mine data from
40:06
your from your database with data from
40:08
like strike or some other source and so
40:11
are we See went when we talk to
40:13
to these people he is that be
40:15
kind of struggle to like either when I
40:17
keep using this or do I like
40:19
completely rebuild everything for those users when we
40:22
talk to them about drug based they get
40:24
very excited because I'm a trapeze you
40:26
can start ago and he can sit in
40:28
your fast with them. And so essentially
40:30
all the models that you've already built
40:32
and Janko the to basically Columbia trapeze
40:34
with up his function because it's all
40:37
Python right now as a D C
40:39
this like okay Jungle admins are great
40:41
up to a certain point and then
40:43
us about what happens right? Like he
40:45
might not want to rebuild everything just
40:47
and you can have internal tooling and
40:49
so as much as I'd have a
40:51
nice spot for us to say the
40:53
drop is can live in your code
40:55
base uses everything you already have but
40:57
he gives you some extra things if
40:59
you want to. Build in Toronto's very
41:01
quickly so that's something you're nervous you
41:03
day they excited about. That's really cool.
41:05
I like that aspect of it. So
41:07
when we talk about this codes guess
41:09
there's two scenarios. the cloud version or
41:12
the self hosted version. And we're and
41:14
how to says Python run as it
41:16
it must be foresee. Python: Is it
41:18
running an isolated docker, containers or new
41:20
cloud? What happens that functions like eight
41:22
of us functions lambda. It's just as
41:24
as runs I their own your and
41:27
your local machine. if you set it
41:29
up as developer. It's all running
41:31
their of Cb. To turn up there
41:33
numeracy be send us your ass and
41:35
in if you set it up, the
41:37
guy in a production instance misses you.
41:39
Deploy this on an easy to your
41:41
Python posters are running on that easy
41:43
to but it's running yeah docker container
41:45
inside to get a little isolation, a
41:47
little bit of protections, that kind of
41:49
stress and we're assuming bad and size
41:51
image your belly. These apps to run
41:53
a you're on infrastructure is idea. With
41:55
that you know what you're doing so
41:57
this is as opposed to us having
41:59
a. The whole cloud version were
42:01
all customers run on trusted code in
42:03
the same sort of back and system
42:06
which would be obscene may dangerous cause
42:08
I'm sure there's ways a customer can
42:10
somehow you know goes to the back
42:12
in an axis other customers on trust
42:15
and code and I would be a
42:17
nightmare and so if you we have
42:19
isolation first major his voice in your
42:21
infrastructure you gonna do is just your
42:24
company's code but and further in a
42:26
we run I found in containers in
42:28
that in an instant that's. of the
42:30
more like of a durability thing
42:32
than anything muses also from isolation
42:34
protection but first and foremost says
42:36
don't let bad Python code take
42:39
down the whole thing in our
42:41
the way we we recommend people
42:43
using using trump is or setting
42:45
up their deaths but a process
42:47
which base is that a word
42:49
that would close as I basically
42:51
sports the be Worth rappers and
42:53
then they would develop locally bill
42:55
test changes he when sir happy
42:57
with the new code yellow push
42:59
it back. In the that last Yazidi
43:01
ensued that production instance and then it
43:03
can proceed control everything from that Nelson
43:06
gives you an extra layer. Okay let's
43:08
make sure that when I would personally
43:10
is tested you can always add test
43:12
databases and you developed locally with before
43:15
you post production where it is gonna
43:17
have to act on your production. The
43:19
yeah that's pretty interesting. I like them
43:22
birth control aspect of it that consider
43:24
a much nicer tad stuff connection to
43:26
real software rather than just it's a
43:28
text input area in. an app that
43:30
who knows what happens as developers the
43:33
it sometimes feels a bit scary right
43:35
like you're building something and it's in
43:37
this other framework and is other cloud
43:39
as it just feels like you said
43:41
kind of get like it if the
43:43
saying goes away like each element see
43:45
your previous code that was another because
43:47
of that we wanted it is in
43:49
this in the school that feels friendly
43:51
for developers that it matches your mental
43:53
models and you're sort of like your
43:56
development process of color like how you're
43:58
used to make and making acid and
44:00
code that we keep that feeling when
44:02
you're building apps and trophies. I want
44:04
to maybe have a PR to understand
44:06
if we accept this change to
44:08
it, right? That's right. Yeah. Yeah. You don't
44:11
normally hear that kind of stuff around these
44:13
kind of tools, you know? And if you
44:15
do, I think it tends to be like,
44:17
yeah, okay, it's like a huge enterprise contract,
44:20
pay us $50,000 a year, and then you
44:22
get version control, which to me, it sounds
44:25
scary. I mean, it just it'll make me a
44:27
little bit less comfortable. Now, obviously, if I'm a
44:29
big company and I just really
44:31
need the tool, sure, maybe I'll just
44:34
pay for it and I get version control.
44:36
But, you know, getting registered control, it just
44:38
feels so like it's like table
44:40
stakes for developers, especially today. But yeah, it
44:42
just wouldn't make sense otherwise for us. I
44:44
mean, the way we're approaching this product. Yeah.
44:46
Well, the other aspect is, you know, what
44:48
are you version controlling? You know, do you
44:50
end up with, you know,
44:52
something like effectively a Jupyter Notebook, like
44:54
big blob of something and then there's
44:56
an older blob of something and then
44:58
you diff it, you're like, what is
45:01
this? But since you end up with
45:03
just these, you know, your workspace files
45:05
that just live there, right? It's a
45:07
real optimize, like show me the changes,
45:09
show me what's happened here. Yeah, it
45:11
all lives there, including the component properties.
45:13
Like we don't store this in like
45:15
a separate database or anything like that.
45:18
So like, you know, like for some
45:20
of their tools, they will
45:22
store all the components in their database. And
45:24
so what they do is, you know, when
45:26
you load up their tools, like their tools
45:28
builder, it'll fetch all the components from the
45:30
provider's database, combine it with maybe the your
45:32
custom code, and then you'll do it. And
45:35
so even that feels like, okay, but where
45:37
am I? Where's like config for my components?
45:39
Yeah, where'd this button come from? Why is
45:41
it gone? That's tough. Yeah, that's tough. And
45:44
then like, imagine if you wanted to like
45:46
share their app. Yeah, it's just
45:48
like version control makes a bit less sense. I
45:50
mean, you're just version controlling, just like the individual
45:52
functions, maybe like the custom part of the code
45:54
that you write, which is still useful, but it
45:56
still feels like you don't have the full picture
45:59
of what's happening. Yeah, you don't have a
46:01
full record. It could easily get out of
46:03
sync. Quite interesting. I guess one thing we
46:06
touched on a little bit before I press
46:08
go here in the show, you said that
46:10
at one point you were considering using Jupyter in
46:13
this whole mechanism.
46:16
What's the story around that? We love
46:18
Jupyter. We love notebooks and we love
46:20
the experience of them, the sense that
46:22
you can write some code and you
46:24
can quickly test and execute the code
46:26
without, basically without needing to write
46:29
anything else. So for prototyping,
46:31
for getting quick feedback, it's great.
46:33
And we wanted to give our
46:35
developers something like that because when you
46:37
build these apps, you're kind of
46:39
iterating, right? You're testing it. A lot
46:42
of times you don't even know the
46:44
documentation for Vibe or HopSpot. And
46:47
so there's a lot of experimentation.
46:49
And so we wanted a quick
46:51
way to do that. So we
46:53
consider maybe having something like a
46:55
Jupyter kernel within Dropbox that allows
46:57
people to do it. There were
46:59
some issues with it in the
47:01
sense that the kernel actually stores
47:03
results from like previous blocks. And
47:05
sometimes I get in the way of you
47:08
triggering an action in a later block. And
47:10
so we were like, okay, maybe that's a
47:12
little bit more than we need. Now we
47:14
still kind of eventually want something like that.
47:16
We hacked it in a way. Like so
47:18
the way that we do it is you
47:21
can write a Python function. You basically get one
47:23
block. You can write a
47:25
Python function and you can click an
47:27
uplay button to basically run that function,
47:30
but it's not like a kernel. So what we
47:32
do is behind the scenes, we
47:34
have like a main function. And when
47:36
you trigger that function, we take the
47:39
state from the client. So whatever you've
47:41
selected or input it, we take the
47:43
underlying file for your Python function, and
47:45
then we call it from it. And
47:47
so we kind of simulate that experience
47:49
of like instantly testing code that you
47:51
just wrote, but there is no, like,
47:54
there is no Jupyter kernel behind the
47:56
scenes. And then you can only do
47:58
one block at a time. So
48:00
we set up a for now as we're getting
48:02
started with it. It's good enough. You
48:05
can write your functions, you can run and test them
48:07
immediately, which is really nice. You
48:09
can do this with VS Code, by the way. Like you
48:11
would have to open up the terminal and then basically run
48:13
your function. And so we still do one of this feature
48:15
where you can click and just see your outputs and basically
48:18
debug and troubleshoot. But it'd be really nice if
48:20
you get out multiple blocks and you can just
48:22
build functions that way. So
48:24
maybe for the future. Interesting. Did you say
48:26
that you were a core developer for Recipiter?
48:29
No, no, I just spoke to them. That
48:32
sounds fun, but I interviewed a whole bunch of
48:34
them recently. What
48:36
I thought was interesting is Jupyter is
48:38
such an empowering thing for Python developers,
48:40
but many of the core developers are
48:42
so focused on writing JavaScript and TypeScript
48:44
to sort of make these interactions possible
48:46
so that the rest of us don't
48:48
have to write JavaScript and that kind
48:50
of stuff. So I think we're getting
48:52
about to the end of our time
48:55
here. I'm sure
48:57
that actually this is somewhat similar. It's
48:59
really a dynamic interactive web app. And in
49:01
that case, it probably has to have some
49:04
interesting frontend JavaScript stuff going on. What's
49:06
the JavaScript story? Yeah. What framework you're
49:08
using and stuff like that? We react
49:10
to build our components. Obviously
49:13
we abstract that away so that
49:15
you as a Python developer, you're
49:17
just writing Python. Well, you're
49:19
writing SQL as well, but let's call that
49:21
Python. And then we deal with the components
49:23
for you. So
49:25
it's not the kind of framework
49:27
where you're writing Python and regenerating
49:30
HTMLX or something like
49:32
that. So obviously we understand
49:34
React and we know we can build
49:37
some beautiful components, customize them with it.
49:39
We weren't about to create a
49:42
completely new framework where we somehow
49:44
just generate HTML from Python. I
49:46
think there's a few people working
49:48
on that actually. We already know React,
49:51
so let's just build those components or
49:53
customize those components and then just let
49:55
people declare them and then sort of
49:58
access and modify them via the the
50:00
context objects in your Python functions.
50:03
So our stack, we use FastAPI
50:05
for our backend, which is great.
50:08
Excellent, yeah. I'm not sure
50:10
if you have had the creator here on. Yeah, I've
50:12
had Sebastian on, I think at
50:14
least three times, Sebastian Ramirez. Yeah,
50:17
he's great. Yeah, he is really great,
50:19
yeah. FastAPI is a fantastic app. And
50:21
so, yeah, we use them, we use
50:23
Reactor, our client side, and
50:25
we, a lot of our infrides
50:27
on AWS. Yeah, sounds really interesting.
50:29
Sounds like a fun app to work on.
50:31
Yeah, you should play around with it. I
50:33
can help you build some apps to manage
50:36
your podcast library. All right, well,
50:38
Jimmy, I think we are pretty much out
50:40
of time, final thought for people
50:42
listening, maybe they're excited to try this out.
50:44
What are you telling them? Yeah, just go
50:46
to dropface.io and sign up for free accounts.
50:49
It's free for developers, you can set it
50:51
up locally. If you have any
50:53
issues setting it up, just reach out, I'll personally
50:55
help you get it up and running, you can
50:57
look at the documentation for everything else. That's
51:00
about it, try it, give us some feedback, we'd love to
51:02
hear from you. Awesome, congrats on building
51:04
a cool project for people and yeah, good
51:06
luck with it. Thanks, Mike. This
51:09
has been another episode of Talk Python to Me.
51:12
Thank you to our sponsors. Be sure to check out
51:14
what they're offering, it really helps support the show. MailTrap,
51:18
an email delivery platform that
51:20
developers love, try for
51:22
free at mailtrap.io. Wanna
51:26
level up your Python? We have one of the
51:28
largest catalogs of Python video courses over at Talk
51:30
Python. Our content ranges from true
51:32
beginners to deeply advanced topics like memory
51:35
and async. And best of all, there's
51:37
not a subscription in sight. Check it
51:39
out for yourself at training.talkpython.fm. Be
51:43
sure to subscribe to the show, open your favorite
51:45
podcast app, and search for Python. We should be
51:47
right at the top. You can also
51:49
find the iTunes feed at slash iTunes,
51:51
the Google Play feed at slash Play,
51:53
and the Direct RSS feed at
51:55
slash RSS on talkpython.fm. We're
51:57
live streaming most of our recordings these days. If
52:00
you want to be part of the show
52:02
and have your comments featured on the air,
52:04
be sure to subscribe to our YouTube channel
52:06
at talkpython.fm slash YouTube. This
52:09
is your host, Michael Kennedy. Thanks so much for listening.
52:11
I really appreciate it. Now, get out there and write
52:13
some Python code. Bye.
Podchaser is the ultimate destination for podcast data, search, and discovery. Learn More