Podchaser Logo
Home
Dropbase: Build Internal Tools with Python

Dropbase: Build Internal Tools with Python

Released Thursday, 2nd May 2024
Good episode? Give it some love!
Dropbase: Build Internal Tools with Python

Dropbase: Build Internal Tools with Python

Dropbase: Build Internal Tools with Python

Dropbase: Build Internal Tools with Python

Thursday, 2nd May 2024
Good episode? Give it some love!
Rate Episode

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.

Unlock more with Podchaser Pro

  • Audience Insights
  • Contact Information
  • Demographics
  • Charts
  • Sponsor History
  • and More!
Pro Features