WEBVTT

00:00:00.020 --> 00:00:04.120
If you've ever been to PyCon, you know one of the best parts of the expo hall is Startup Row,

00:00:04.270 --> 00:00:07.880
a stretch of booths where early-stage companies built on Python show off what they're creating,

00:00:08.360 --> 00:00:12.980
but only attendees get to walk that lane. So let's bring it to everyone. In this episode,

00:00:13.190 --> 00:00:17.760
we stroll down Startup Lane together. We kick things off with the organizers, Jason and Shay,

00:00:18.240 --> 00:00:24.019
who share the program's origin story going back to Paul Graham and the PSF, plus some surprising

00:00:24.040 --> 00:00:30.760
stats, including two unicorns among the alumni. Then we meet five startups, Tetrix, bringing AI

00:00:31.000 --> 00:00:36.220
to institutional investing in private markets, ArcGET, security that lives inside your app as an

00:00:36.310 --> 00:00:42.660
SDK, Femoral.dev, serverless hosting built for Python web apps, Capitio, an identity and authority

00:00:42.840 --> 00:00:48.820
layer for AI agents, and Pixel Table, a multimodal database from Marcel Kroniker, co-creator of Apache

00:00:49.020 --> 00:00:54.000
Parquet. See if you can spot the theme running through them all. Let's go for a walk. This is

00:00:54.020 --> 00:00:58.160
Episode 551, recorded June 11th, 2026.

00:01:15.600 --> 00:01:20.160
Welcome to Talk Python To Me, the number one Python podcast for developers and data scientists.

00:01:20.760 --> 00:01:22.080
This is your host, Michael Kennedy.

00:01:22.140 --> 00:01:26.000
I'm a PSF fellow who's been coding for over 25 years.

00:01:26.640 --> 00:01:27.760
Let's connect on social media.

00:01:28.080 --> 00:01:31.240
You'll find me and Talk Python on Mastodon, BlueSky, and X.

00:01:31.400 --> 00:01:33.340
The social links are all in your show notes.

00:01:34.120 --> 00:01:37.640
You can find over 10 years of past episodes at talkpython.fm.

00:01:37.820 --> 00:01:41.000
And if you want to be part of the show, you can join our recording live streams.

00:01:41.280 --> 00:01:41.840
That's right.

00:01:42.080 --> 00:01:45.300
We live stream the raw uncut version of each episode on YouTube.

00:01:45.880 --> 00:01:50.300
Just visit talkpython.fm/youtube to see the schedule of upcoming events.

00:01:50.480 --> 00:01:54.180
Be sure to subscribe there and press the bell so you'll get notified anytime we're recording.

00:01:54.860 --> 00:01:57.840
What if your AI agents worked like FastAPI microservices,

00:01:58.500 --> 00:02:00.780
typed, autonomous, and discovering each other at runtime?

00:02:01.480 --> 00:02:03.140
That's the world Agent Field is building.

00:02:03.810 --> 00:02:06.660
Join them at talkpython.fm/agentfield.

00:02:07.860 --> 00:02:13.500
To kick off this episode, we have the organizers of Startup Bro at PyCon, Jason and Shay.

00:02:14.360 --> 00:02:15.300
Welcome to Talk Python To Me.

00:02:15.610 --> 00:02:16.080
Great to meet you.

00:02:16.320 --> 00:02:17.100
Thanks for having us.

00:02:17.540 --> 00:02:18.080
Great to be here.

00:02:18.340 --> 00:02:47.240
I think this is a really cool idea. Long ago, way back, I think it was 2023, I did a stroll down startup lane. And the idea was, hey, this startup row is a really cool experience. But only attendees of the conference actually get to walk down the lane, walk down startup row, talk to each company, see what they're building, get that energy. So let's bring it to the podcast listeners, bring it to the world. So here we are. And you two are the organizers, right?

00:02:47.340 --> 00:02:48.500
Mm-hmm. That's right.

00:02:48.790 --> 00:02:50.560
Well, thank you very much on behalf of everyone.

00:02:50.930 --> 00:02:51.520
Quick introduction.

00:02:52.480 --> 00:02:53.340
Shay, welcome to the show.

00:02:53.690 --> 00:02:54.080
Thank you.

00:02:54.520 --> 00:02:55.140
Yeah, tell us about yourself.

00:02:55.480 --> 00:02:57.780
So my background's in early stage venture and technology.

00:02:57.990 --> 00:03:00.460
I was part of the founding team of a fund called True Ventures.

00:03:00.920 --> 00:03:03.160
And then I was there for three funds, seven years.

00:03:03.820 --> 00:03:06.660
And then after that, decided I wanted to start a company of my own.

00:03:07.040 --> 00:03:12.120
So we were a full stack Python dev shop, and we were building an EdTech SaaS product.

00:03:12.560 --> 00:03:18.060
And we had the opportunity to be featured on Startup Row at PyCon in Montreal in 2015.

00:03:18.340 --> 00:03:20.160
So that was my introduction to the community.

00:03:20.540 --> 00:03:21.800
And I had a fantastic experience.

00:03:22.480 --> 00:03:23.700
And then we later got acquired.

00:03:24.280 --> 00:03:29.040
And so in order to give back to the community, I started judging with Jason a couple years

00:03:29.240 --> 00:03:29.320
later.

00:03:29.380 --> 00:03:33.240
He asked me if I would help contribute to the process by being one of the judges that

00:03:33.400 --> 00:03:34.020
selected the companies.

00:03:34.680 --> 00:03:37.260
And then a couple of years ago, asked me if I would co-organize with him.

00:03:37.700 --> 00:03:39.020
So that's how I got involved.

00:03:39.220 --> 00:03:41.800
I've loved being part of the community.

00:03:41.920 --> 00:03:47.200
I think it's fantastic and used to go to software development meetups in San Francisco to recruit technical talent.

00:03:47.660 --> 00:03:51.360
And I always wondered, you know, with my venture investing hat on, why aren't the VCs here?

00:03:51.480 --> 00:03:53.620
Because these are the people building incredible technologies.

00:03:53.920 --> 00:04:00.020
And so really see the opportunity to feature these great companies that have become part of our corpus of startup for talent.

00:04:00.560 --> 00:04:03.760
So you've lived the entire journey, which is awesome. Congratulations.

00:04:04.740 --> 00:04:05.080
Thank you.

00:04:05.580 --> 00:04:06.260
Jason, welcome.

00:04:06.620 --> 00:04:07.780
Hey, good to be here.

00:04:08.740 --> 00:04:09.980
So how did I get involved?

00:04:09.980 --> 00:04:21.579
It was around 2015 when I was a financial journalist primarily covering startups and technology and venture capital stuff.

00:04:21.840 --> 00:04:35.820
When at the time, the then organizer of Startup Road asked me to pinch hit for a friend of mine who was going to be co-hosting or emceeing a pitch event in Chicago.

00:04:38.020 --> 00:04:40.900
And unfortunately, my friend wasn't able to participate.

00:04:43.340 --> 00:04:49.460
And at the time, the organizer, Startup Pro, asked me, oh, hey, Jason, you do some stuff with media.

00:04:49.700 --> 00:04:51.980
You seem like you'd be good on stage.

00:04:52.100 --> 00:04:53.560
I'm like, no, that's not true.

00:04:54.380 --> 00:04:56.620
And he's just like, but you know some stuff about startups.

00:04:56.660 --> 00:04:57.820
And I'm like, yeah, that is true.

00:04:57.840 --> 00:05:07.300
And long story short is I got convinced to host this pitch event, and I really fell in love with the Python community.

00:05:07.360 --> 00:05:12.780
This was during a time in my career where I was sort of transitioning into doing more like data journalism.

00:05:13.640 --> 00:05:20.520
And I got really frustrated with like the limits of what I could do with, you know, Excel, you know.

00:05:20.720 --> 00:05:27.040
And this was just at the very beginning of my journey, learning what little Python that I do know.

00:05:27.980 --> 00:05:30.680
And so, you know, it's an amazing community.

00:05:30.740 --> 00:05:37.160
and very long story short, this is my 10th year of organizing or being a co-organizer of Startup

00:05:37.190 --> 00:05:43.660
Row. I sort of became the primary organizer in 2019, and I'm really excited to have Shea board.

00:05:45.040 --> 00:05:48.060
I have some statistics to share, but I'm happy to share those later.

00:05:50.280 --> 00:05:52.880
But yeah, that's a little bit about my background. Awesome. Very interesting.

00:05:53.320 --> 00:05:58.040
So let's, I do want to hear your statistics. I think they're very interesting. And I have a

00:05:58.000 --> 00:06:03.420
little hint of what we discussed. So I have a hint of where you're going. But before we get into

00:06:03.440 --> 00:06:08.880
that, let's just give everyone a quick, Shay, maybe give everyone a quick overview. What is Startup Row?

00:06:09.420 --> 00:06:13.960
Why are companies there? How do they get there? Yeah, it's a great backstory, actually. So in 2011,

00:06:14.380 --> 00:06:19.340
Paul Graham of Y Combinator was collaborating with the Python Software Foundation. And with the

00:06:19.520 --> 00:06:24.679
impetus of we want to see more startups at PyCon, we want to feature more of these amazing companies

00:06:24.680 --> 00:06:27.040
that are starting new technologies and building things from scratch.

00:06:27.620 --> 00:06:29.580
We want to give them an opportunity for a spotlight,

00:06:29.760 --> 00:06:32.560
but many of them are so early stage they can't afford the price of admission

00:06:32.740 --> 00:06:33.520
or the conference ticket.

00:06:33.760 --> 00:06:37.560
What can we do to help create an on-ramp for them and then to feature them?

00:06:37.980 --> 00:06:39.340
And that's the origin of how it started.

00:06:39.660 --> 00:06:45.080
And it's been amazing that we're 15 years in and the company is just fantastic.

00:06:46.420 --> 00:06:50.160
As Jason alluded, we've got some great alumni companies as well.

00:06:51.360 --> 00:06:53.620
All right. Well, let's hear the stats, Jason.

00:06:54.200 --> 00:07:02.360
Okay, so since the program's inception, there's been approximately 170, 175 companies that have come through Startup Pro.

00:07:03.819 --> 00:07:06.860
The format of the program has changed a little bit over time.

00:07:07.240 --> 00:07:19.400
It used to be the case that there would be eight companies featured, say, on Friday, and then a whole brand new batch of eight companies featured on Saturday, the two different days of the primary expo hall.

00:07:19.980 --> 00:07:25.180
That was kind of a crazy and untenable situation for everybody in the long haul.

00:07:25.520 --> 00:07:27.960
And so we have now eight companies per batch.

00:07:28.100 --> 00:07:35.660
And so if you look at from 2019 through 2025, so that's counted six batches.

00:07:36.860 --> 00:07:39.620
You know, we're looking at about eight companies.

00:07:39.680 --> 00:07:40.460
Oh, hang on one second.

00:07:40.860 --> 00:07:41.700
Was that six batches?

00:07:42.180 --> 00:07:42.420
One moment.

00:07:42.420 --> 00:07:42.940
I apologize.

00:07:43.460 --> 00:07:44.020
Seven batches.

00:07:44.140 --> 00:07:44.540
Forgive me.

00:07:45.800 --> 00:07:46.560
Seven batches.

00:07:46.700 --> 00:07:50.700
We have roughly 60 companies in that pool.

00:07:51.910 --> 00:07:55.600
Of those, we have 32 of them are currently active.

00:07:56.600 --> 00:07:58.100
11 of them have been acquired.

00:07:59.000 --> 00:08:01.680
15 of them are unfortunately no longer with us.

00:08:02.520 --> 00:08:07.380
And a couple of them, based on public activity, a little bit difficult to tell where they're at.

00:08:08.040 --> 00:08:14.580
But the bottom line is that of this population of companies that have come through recent startup row batches,

00:08:15.500 --> 00:08:22.460
You know, we're looking at approximately, you know, 12 to, you know, 15 percent of them having been acquired.

00:08:23.200 --> 00:08:30.140
And then also in that group, we have a couple of companies that have achieved two companies that have achieved unicorn status.

00:08:30.270 --> 00:08:32.680
So evaluation of a billion dollars or more.

00:08:33.440 --> 00:08:46.440
That includes a returning PyCon sponsor, ChainGuard, which is, I think, valued at three and a half or three point eight billion dollars today after their most recent funding round.

00:08:47.620 --> 00:08:54.660
And, yeah, it's it's a it's a pretty impressive population of companies that have come through Startup Row.

00:08:55.500 --> 00:09:02.720
And it's been a real joy to see, you know, where everybody has gone after their, you know, after their time at PyCon.

00:09:03.080 --> 00:09:15.500
That's incredible. I think those are super good numbers compared to just the general population of startups. Maybe we could kind of close it out with your thoughts, Shay, since you have some of the investing side. Those sound like good numbers to you as well?

00:09:15.800 --> 00:09:29.640
That's fantastic. And one of the things I enjoy is that it's such a robust community that when a company comes into Startup Bro, they're getting to meet with their ICP, their ideal customer profile. They're getting to hear straight from the mouths of the developers.

00:09:30.620 --> 00:09:32.100
They're also fantastic people.

00:09:32.200 --> 00:09:41.280
So it's really exciting to help connect them with the right opportunities and to see some of the larger sponsors at PyCon come over and interface with them and learn about what they're developing.

00:09:41.460 --> 00:09:48.300
And one of my favorite times at Startup Pro is to see everybody gathered around the computer screen watching the demo and pointing and troubleshooting.

00:09:49.380 --> 00:09:56.420
And one of the companies that you've interviewed, they were saying how many uploads they've had of their product even just during the two days that they were featured.

00:09:56.620 --> 00:09:59.440
And so you see the excitement straight from the developers.

00:10:00.200 --> 00:10:07.720
It doesn't hurt that it's become the lingua franca for all of the large language models and the different evolution of the technology that we're seeing today.

00:10:08.020 --> 00:10:10.140
So Jason, I think it's a fantastic opportunity.

00:10:10.580 --> 00:10:14.440
And we love being part of helping the founders on their journey.

00:10:14.820 --> 00:10:17.140
Well, let's see if we can get some extra work for you all next year.

00:10:17.260 --> 00:10:21.780
Maybe you all could give a quick shout out just to how people apply and what the criteria are.

00:10:21.980 --> 00:10:23.360
Oh, absolutely.

00:10:24.220 --> 00:10:24.880
Everyone's take it.

00:10:25.380 --> 00:10:25.900
Oh, sorry.

00:10:26.060 --> 00:10:26.739
Oh, sure.

00:10:28.699 --> 00:10:29.100
Sure.

00:10:29.340 --> 00:10:29.500
Absolutely.

00:10:29.980 --> 00:10:35.340
So there are three very basic rules for qualifying to be on Startup Row.

00:10:36.400 --> 00:10:38.820
And two of them are somewhat fuzzy.

00:10:39.350 --> 00:10:43.440
The one non-negotiable is obviously you got to use Python somewhere in your stack.

00:10:43.890 --> 00:10:44.560
The more the better.

00:10:44.870 --> 00:10:51.800
There is definitely a slight implicit bias in favor of companies that are building open source projects.

00:10:52.030 --> 00:10:54.980
But that is by no means a requirement to be on Startup Row.

00:10:55.500 --> 00:11:00.480
In addition to that, in general, companies are younger than sort of two and a half or

00:11:00.590 --> 00:11:01.400
three years old.

00:11:01.790 --> 00:11:07.020
And that can be measured from the, you know, either from the incorporation date or like

00:11:07.140 --> 00:11:11.440
if the team has been working on a project and then did some major pivot like a couple

00:11:11.580 --> 00:11:16.160
years ago, you know, that's not necessarily a count against their, you know, their eligibility.

00:11:17.040 --> 00:11:20.999
It's just like, you know, we're trying not to feature companies that were founded 10

00:11:21.020 --> 00:11:26.020
years ago and are, you know, more justifiably categorized as like robust small software

00:11:26.260 --> 00:11:26.440
businesses.

00:11:27.000 --> 00:11:27.120
Right.

00:11:27.640 --> 00:11:34.860
And then the final one is, you know, in general, roughly 25 people on the team or smaller,

00:11:35.440 --> 00:11:39.720
again, with a bias in favor of smaller teams, just in service of there are plenty.

00:11:40.000 --> 00:11:45.400
I'm sure that there are plenty, you know, 120 person Series B startups that would love

00:11:45.560 --> 00:11:48.500
free booth space on startup pro at PyCon US.

00:11:48.560 --> 00:11:52.460
But this really is for much smaller, earlier stage, high growth ventures.

00:11:52.760 --> 00:11:53.320
That sounds great.

00:11:53.690 --> 00:11:56.120
Final word, Shay, how do people apply?

00:11:56.360 --> 00:11:57.860
When do applications open?

00:11:58.040 --> 00:11:58.600
Things like that.

00:11:58.840 --> 00:12:03.420
Yes, it moves a little bit depending upon our collaboration with the Python Software Foundation.

00:12:03.820 --> 00:12:09.220
But usually applications open right around December, beginning of the year, because PyCon,

00:12:09.290 --> 00:12:10.260
as you know, is held in May.

00:12:10.330 --> 00:12:12.940
And so we like to have plenty of lead time for the companies to apply.

00:12:13.210 --> 00:12:15.940
And also we're trying to coordinate better with the speaker talks.

00:12:16.200 --> 00:12:20.940
They can do a submission to have a speaker talk as well, but usually around December, early December.

00:12:21.520 --> 00:12:28.260
And Jason, we should probably put an email address up so people can start to reach out in advance if they'd like as well.

00:12:28.560 --> 00:12:36.020
Yes, we should. I do believe we have startups at python.org or it's startupro at python.org.

00:12:36.220 --> 00:12:38.580
But Michael, I'll get back to you and confirm.

00:12:39.020 --> 00:12:43.740
Let's do this. Send it to me and I'll put it in the show notes so people have it right there.

00:12:44.020 --> 00:12:44.560
That would be great.

00:12:45.100 --> 00:12:50.480
Once we put the call out, it's a quick intake application, a few short questions, and then

00:12:50.640 --> 00:12:53.240
we have a panel of judges with different backgrounds to evaluate.

00:12:53.880 --> 00:12:57.600
And the news usually goes out in January and then tee everything up from there.

00:12:57.760 --> 00:12:58.120
Fantastic.

00:12:58.600 --> 00:12:58.920
All right.

00:12:59.200 --> 00:13:00.700
Shay, Jason, thank you for being on the show.

00:13:01.000 --> 00:13:02.660
And thanks for organizing Startup Row.

00:13:02.760 --> 00:13:03.100
It's been great.

00:13:03.420 --> 00:13:04.040
Thank you, Michael.

00:13:04.180 --> 00:13:04.660
Great to meet you.

00:13:05.080 --> 00:13:05.220
Yeah.

00:13:05.520 --> 00:13:05.860
Yeah, you bet.

00:13:05.960 --> 00:13:06.140
Bye-bye.

00:13:06.480 --> 00:13:06.680
Cheers.

00:13:08.740 --> 00:13:11.320
This portion of Talk Python on Me is brought to you by Agent Field.

00:13:11.660 --> 00:13:16.760
What happens when you give hundreds of AI agents a shared code base and let them write code,

00:13:17.190 --> 00:13:19.440
review each other's work, and ship to production?

00:13:20.220 --> 00:13:23.680
Well, that's exactly what the team behind AgentField AI built.

00:13:24.300 --> 00:13:28.040
And the wild part, it's not some proprietary system locked behind a paywall.

00:13:28.380 --> 00:13:30.100
It's an open source Python library.

00:13:30.600 --> 00:13:34.340
Now, where most agent frameworks have you wiring up DAGs and workflows,

00:13:35.040 --> 00:13:39.600
AgentField lets you build AI agents the way you'd build FastAPI microservices.

00:13:40.260 --> 00:13:43.740
Think typed Python functions that become autonomous services.

00:13:44.540 --> 00:13:49.620
They discover each other at runtime, call each other like APIs, scale independently,

00:13:50.180 --> 00:13:52.060
fail independently, and recover on their own.

00:13:52.320 --> 00:13:53.040
And here's the thing.

00:13:53.440 --> 00:13:55.460
You're not just orchestrating LLM calls.

00:13:56.080 --> 00:13:58.200
You can orchestrate entire anonymous tools.

00:13:58.840 --> 00:14:04.280
Spin up multiple Claude Code instances, codec sessions, any coding harness you want,

00:14:04.560 --> 00:14:09.620
all running as live nodes on the same architecture, collaborating and verifying each other's output.

00:14:10.440 --> 00:14:14.720
that's how they build the factory and it's completely free and open source check it out

00:14:14.730 --> 00:14:21.080
at talkpython.fm/agentfield that's talkpython.fm/agentfield the link is in your podcast

00:14:21.210 --> 00:14:26.840
player show notes thank you to agentfield for supporting the show now let's meet our first

00:14:27.270 --> 00:14:34.240
startup tetrix from nanid and grant nanid grant welcome to talk python and me amazing to have you

00:14:34.320 --> 00:14:38.779
here thank you for having us michael yeah congratulations on being part of startup row

00:14:39.060 --> 00:14:44.760
A few years ago, I did this episode where we did a stroll down startup lane, and I'm very excited to do it again this year.

00:14:45.260 --> 00:14:50.320
And there's a theme. We'll see if people can detect the theme throughout this episode.

00:14:50.780 --> 00:14:53.640
But it is also evident here, and that's great.

00:14:53.880 --> 00:14:59.600
So let's just do a quick round of introductions before we dive into Tetrix, your company, and how you got on Startup Row and stuff.

00:14:59.880 --> 00:15:00.360
Nanit, go first.

00:15:00.860 --> 00:15:05.380
Sure, happy to. So I'm Nanit. I'm the co-founder and chief technology officer of Tetrix.

00:15:05.620 --> 00:15:11.920
I've been a huge nerd about tech ever since I was a child and transformed that into my degree, then eventually a career.

00:15:12.360 --> 00:15:16.220
And now I get to work with some of the smartest people building some of the coolest things in financial markets.

00:15:16.780 --> 00:15:21.060
Very cool. It's such an incredible time to be a builder. So amazing. Grant. Hello.

00:15:21.440 --> 00:15:25.240
Yeah. Hi. So I'm Grant. I'm the founding engineer at Tetrix.

00:15:26.460 --> 00:15:32.060
Background in finance and technology. Former investment banker turned software engineer.

00:15:32.780 --> 00:15:38.820
So really excited to, was really excited to join Tetrix and build what we have.

00:15:39.020 --> 00:15:44.380
Well, I have a really good friend who has worked in basically as a lawyer and in banking and so on.

00:15:44.680 --> 00:15:45.740
And he also does tech now.

00:15:45.800 --> 00:15:47.360
We love to exchange stories.

00:15:47.540 --> 00:15:48.580
It's a different kind of world, huh?

00:15:48.980 --> 00:15:49.260
Very.

00:15:50.940 --> 00:15:51.980
I think it's a fun one though.

00:15:52.100 --> 00:15:55.400
And, you know, let's talk about your project that you've been working on, Tetrix.

00:15:55.920 --> 00:15:57.940
So this is what you were presenting on Startup Row.

00:15:58.280 --> 00:15:59.540
I'll tell it to the audience.

00:15:59.620 --> 00:16:00.020
What do you got?

00:16:00.300 --> 00:16:00.620
Absolutely.

00:16:01.060 --> 00:16:05.460
So Tetrix is an AI investment platform for institutional investors investing in private

00:16:05.660 --> 00:16:05.940
markets.

00:16:06.440 --> 00:16:09.220
And I know that's a mouthful for people who aren't in this space.

00:16:09.380 --> 00:16:10.760
So let me break it down a little bit.

00:16:11.420 --> 00:16:13.800
So AI investment platform for institutional investors.

00:16:14.220 --> 00:16:19.460
So our customers tend to be institutional investors like endowments, foundations, family

00:16:19.620 --> 00:16:20.740
offices, pension funds.

00:16:21.110 --> 00:16:24.580
Think of it as the pool of investors with the largest amounts of capital in the world.

00:16:24.960 --> 00:16:28.680
And when you have that much capital, you're not just invested in public markets, which

00:16:28.600 --> 00:16:33.140
is stuff like stocks, bonds, things that people are generally familiar with. But you also invest

00:16:33.140 --> 00:16:37.820
in private markets, which is venture capital, private equity, private credit, private infrastructure,

00:16:37.820 --> 00:16:43.660
and those asset classes. And what Tetrix does is it makes the management of your investments in

00:16:43.720 --> 00:16:48.820
private markets much easier by solving three main pain points. Pain point one is the pain of

00:16:49.060 --> 00:16:53.240
monitoring and collecting documents from multiple different sources on the internet. Pain point

00:16:53.380 --> 00:16:58.040
number two is taking all of that unstructured data, structuring it and normalizing it,

00:16:58.300 --> 00:17:02.680
And then solving pain point three, which is the lack of analytics and insights that currently

00:17:02.860 --> 00:17:07.280
exist in the market by bridging that with our data sets and our extractions to make sure

00:17:07.400 --> 00:17:10.560
that institutional investors can make more confident investment decisions.

00:17:11.660 --> 00:17:14.079
And the platform has really taken off since we launched it.

00:17:14.120 --> 00:17:18.280
And the ROI is very evident, whether it's compression of time from 45 days to one day

00:17:18.400 --> 00:17:23.040
to insights, whether it is the thousands of hours manually being saved or the 10x deeper

00:17:23.319 --> 00:17:25.140
insights that customers are generating from the platform.

00:17:25.520 --> 00:17:25.699
Okay.

00:17:26.040 --> 00:17:27.220
Well, that sounds super interesting.

00:17:27.420 --> 00:17:32.940
I did need to, when I first spoke to you, get a little bit of education on what limited partners exactly means in investing.

00:17:33.340 --> 00:17:37.980
If I think about where AI has leverage, people talk about, oh, the AI bubble.

00:17:38.740 --> 00:17:42.860
Maybe like my male client doesn't necessarily need AI and that kind of just gets in the way.

00:17:43.300 --> 00:17:45.980
But there are areas where it applies so well.

00:17:46.290 --> 00:17:48.980
I think coding and data science is probably number one.

00:17:49.320 --> 00:17:55.860
But I've always felt that investing has this special lever for AI that you could really get a lot out of.

00:17:56.040 --> 00:17:57.740
And I haven't done nothing with it.

00:17:57.760 --> 00:17:58.320
I don't know why.

00:17:58.360 --> 00:18:00.060
I feel like, I guess because I don't have the experience,

00:18:00.280 --> 00:18:02.020
but Grant, you've been in a banker.

00:18:02.520 --> 00:18:05.160
So you know the actual day-to-day problems, right?

00:18:05.500 --> 00:18:06.060
Yeah, exactly.

00:18:06.360 --> 00:18:08.300
I mean, one of the, like, I mean, as a banker,

00:18:08.620 --> 00:18:11.140
like doing what we do, like docking processing,

00:18:11.500 --> 00:18:15.860
like that was all manual effort of like literally typing in like values

00:18:16.000 --> 00:18:18.800
into Excel from like PDF reports, those types of things.

00:18:19.460 --> 00:18:22.940
And being able to kind of like streamline that really manual process

00:18:23.400 --> 00:18:25.280
is like really fascinating.

00:18:25.440 --> 00:18:30.320
Because there were so many hours spent late at night doing this very annoying manual process.

00:18:30.610 --> 00:18:36.700
And now that you can kind of do that unstructured to structured transition with LLMs is really exciting.

00:18:36.940 --> 00:18:37.680
It's super exciting.

00:18:38.120 --> 00:18:44.820
And people always say, oh, man, I always wanted to have some kind of thing help me out.

00:18:45.010 --> 00:18:46.500
But I wanted to help me with the drudgery.

00:18:46.550 --> 00:18:48.540
I didn't want it to write music and write code.

00:18:48.590 --> 00:18:51.260
I wanted to do the boring stuff and I wanted to do the exciting stuff.

00:18:51.490 --> 00:18:54.180
But it sounds like you're kind of leveraging it for the boring stuff here.

00:18:54.560 --> 00:18:54.960
Exactly.

00:18:55.360 --> 00:19:00.460
Exactly. And even not just for customer specific use cases, when you look and peer behind the

00:19:00.590 --> 00:19:04.520
curtain at Tetrix internally, whether we're on the engineering side, the business side,

00:19:04.960 --> 00:19:08.600
everyone is leveraging what's being shipped out, whether it's connecting to MCP servers to make

00:19:08.600 --> 00:19:13.260
their workflows more efficient, whether it is using cloud routines to automate some of the tasks.

00:19:13.530 --> 00:19:17.520
We are always thinking about how can we execute faster internally and how can we keep delivering

00:19:17.700 --> 00:19:22.960
value to our customers using the AI as a tool rather than just kind of AI wash everything and

00:19:22.960 --> 00:19:24.960
say we are an AI native company just for the sake of it.

00:19:25.300 --> 00:19:27.480
I mean, that's where the VC is, but just kidding.

00:19:28.100 --> 00:19:29.220
Sort of, sort of.

00:19:29.740 --> 00:19:33.680
But how do you guys go about making sure that the AI stays on track?

00:19:34.400 --> 00:19:39.920
You know, one, I actually, I did use AI for this investment thing that I'm doing.

00:19:40.080 --> 00:19:44.040
And it's like a retirement planner, which is fine, you know, but it's not invested in like

00:19:44.090 --> 00:19:45.520
the same sense that you all are.

00:19:45.840 --> 00:19:49.520
And the AI like gives you recommendations on how your retirement plan is going.

00:19:49.940 --> 00:19:51.640
And I get the sense, I don't know for sure.

00:19:51.720 --> 00:19:52.160
I haven't used enough.

00:19:52.360 --> 00:19:56.920
I get the sense they're using a cheap model to get fast results, which makes me sad.

00:19:57.040 --> 00:20:02.560
Like if they were using Opus or GPD5 Pro, you could get such good answers.

00:20:03.080 --> 00:20:07.640
But it's really, really quick and responding just makes me real nervous that the answers are super shallow.

00:20:07.820 --> 00:20:10.900
So how do you, I mean, it's important the answers and the details you give to people.

00:20:11.000 --> 00:20:13.360
They're making really large decisions.

00:20:13.800 --> 00:20:16.500
It's not like, oh, I'll buy $1,000 of this stock.

00:20:16.900 --> 00:20:21.080
You know, I'll buy thousands of shares of this stock type of thing, given your clientele.

00:20:21.240 --> 00:20:24.060
So how do you make sure the AI is on rails?

00:20:24.500 --> 00:20:25.780
No, that's an excellent question.

00:20:26.080 --> 00:20:29.540
And to your point in finance, like trust is the name of the currency.

00:20:29.880 --> 00:20:35.120
And for our customers, it is essential that we are at 100% accuracy with every data point

00:20:35.160 --> 00:20:38.000
that we report because the decisions made are so consequential.

00:20:38.740 --> 00:20:42.520
To answer your question, there's quite a bit of discipline that we have within the Tetrix

00:20:42.760 --> 00:20:46.360
engineering processes to make sure that we are able to get more deterministic nature

00:20:46.480 --> 00:20:48.860
of outputs from something that's inherently probabilistic.

00:20:49.620 --> 00:20:54.480
And part of those, without disclosing too much of the secret sauce, but some top things are A,

00:20:54.840 --> 00:21:00.320
we invested a lot upfront in building our AI and evaluation harnesses. The good news is that the

00:21:00.480 --> 00:21:06.340
fact that we need 100% data accuracy means that we have very, very good data sets that are already

00:21:06.520 --> 00:21:11.400
annotated, have a human in the loop in terms of making sure it's 100%. And when we run experiments

00:21:11.700 --> 00:21:16.619
against those harnesses and those evals, it allows us to move really quickly and also figure out

00:21:16.640 --> 00:21:20.720
very quickly if something is breaking or not. So that was number one, because you can't solve what

00:21:20.720 --> 00:21:25.600
you don't know. Number two was most of our team has a lot of financial background, whether it is

00:21:25.650 --> 00:21:30.720
Grant, obviously, as an ex-investment banker, my co-founder or others. And what we have done is take

00:21:30.880 --> 00:21:36.740
that institutional knowledge of finance and encode it into a set of over 250 financial rules that are

00:21:36.920 --> 00:21:41.800
checking the outputs generated by the LLMs to make sure that things actually make sense from a

00:21:42.020 --> 00:21:45.299
financial perspective, whether it's within a document or when you look at things from a time

00:21:45.320 --> 00:21:50.200
series perspective. And number three is we have also built a lot of feedback loops so that whenever

00:21:50.340 --> 00:21:54.600
there's a human review or there's an erroneous data point spotted, we actually learn from that

00:21:54.840 --> 00:21:58.380
behavior and make sure that the subsequent extractions keep getting better and better.

00:21:58.780 --> 00:22:03.300
So with some of these things, we have been able to really get very high accuracy. And in private

00:22:03.480 --> 00:22:08.160
markets, I would argue we have the highest accuracy out of the box where our average accuracy is 96%.

00:22:09.020 --> 00:22:13.280
And that number keeps ticking upwards as we continue investing in this part of the platform.

00:22:13.840 --> 00:22:20.860
cool. So why Startup Row? How'd you end up there? Yeah, so we applied for Startup Row to, so we

00:22:20.940 --> 00:22:28.660
wanted to be more integrated into the Python community and also to expand our team. So we

00:22:28.980 --> 00:22:34.840
applied given that PyCon's the largest event conference for Python developers and our whole

00:22:35.240 --> 00:22:39.980
backend is built in Python. We wanted to kind of go there for a recruiting perspective, get the best

00:22:39.980 --> 00:22:44.760
and brightest talent and also see what other people, other companies and, you know, individuals

00:22:44.900 --> 00:22:49.680
are working on, whether it be open source projects or, you know, companies that we use

00:22:49.680 --> 00:22:50.740
on a day to day basis.

00:22:51.820 --> 00:22:51.900
Yeah.

00:22:51.940 --> 00:22:57.700
So basically, and also to tell people about what we're doing and kind of get the word

00:22:57.840 --> 00:22:59.100
out about Tetrix.

00:22:59.440 --> 00:22:59.860
Yeah, cool.

00:23:00.160 --> 00:23:03.480
So you're looking for possibly hiring some Python folks?

00:23:03.980 --> 00:23:04.060
Yep.

00:23:04.320 --> 00:23:09.040
Across the stack, we're looking to definitely scale up our engineering team.

00:23:09.200 --> 00:23:14.880
so yeah, I mean, front end, full stack back end, but you know, from a, an AML,

00:23:14.900 --> 00:23:18.820
but from a coding perspective, like definitely at least a lot of their backend data pipeline,

00:23:19.060 --> 00:23:20.600
that kind of thing, fully in Python.

00:23:21.060 --> 00:23:22.720
Well, I was talking to someone else.

00:23:22.840 --> 00:23:26.240
I won't call them out explicitly just now, but they had a really interesting insight

00:23:26.700 --> 00:23:30.300
saying that, you know, AI is going to change our jobs, obviously.

00:23:30.620 --> 00:23:35.439
I mean, that's not a huge revelation, but, but that it's probably going to shrink really

00:23:35.460 --> 00:23:40.680
large companies, because there's kind of a lot of support that maybe the AIs can do, but it's also

00:23:40.760 --> 00:23:46.100
going to expand out the existence of small companies, what small companies can do and so on.

00:23:46.140 --> 00:23:50.680
And it kind of sounds like you're a bit of an embodiment of that. Yeah, I think that's a fair

00:23:51.200 --> 00:23:56.440
analysis. I mean, we are a small but mighty team. We're growing, adding headcount as needed,

00:23:56.580 --> 00:24:02.559
but AI is obviously supercharging productivity internally as well. So what a person can deliver

00:24:02.860 --> 00:24:04.900
in a unit time has for sure increased

00:24:04.950 --> 00:24:06.460
and we want to keep leveraging those things

00:24:06.510 --> 00:24:07.380
to make sure that's true.

00:24:07.640 --> 00:24:08.600
But at the same time,

00:24:09.360 --> 00:24:11.260
there's so much demand for the product at the moment

00:24:11.400 --> 00:24:12.980
that capacity still is the constraint

00:24:13.200 --> 00:24:16.240
and hence why we're very excited to bring on more folks

00:24:16.360 --> 00:24:18.100
who have Python expertise into our community

00:24:18.500 --> 00:24:19.980
and into our team and work with them.

00:24:20.940 --> 00:24:21.940
That sounds really good.

00:24:21.990 --> 00:24:23.120
That sounds really positive.

00:24:23.270 --> 00:24:24.420
Like things are going well for you.

00:24:24.680 --> 00:24:26.680
I talked to Jason, the organizer of Startup Row

00:24:26.920 --> 00:24:28.660
and pointed out how many of the companies

00:24:28.770 --> 00:24:30.620
are either still going, got acquired

00:24:30.960 --> 00:24:32.460
or went public or whatever.

00:24:32.640 --> 00:24:34.080
So there's a good track record there.

00:24:34.340 --> 00:24:36.620
So how did your experience at Startup Row go?

00:24:37.000 --> 00:24:38.020
Was it worth going?

00:24:38.580 --> 00:24:41.840
Did you meet people who might be investors or partners?

00:24:42.220 --> 00:24:44.180
Did you find people who might build some of these roles?

00:24:44.600 --> 00:24:45.300
Was it worth going?

00:24:45.600 --> 00:24:46.180
Yeah, definitely.

00:24:46.440 --> 00:24:48.620
I mean, it was definitely a really great experience.

00:24:48.760 --> 00:24:52.660
I mean, we got to basically talk with a lot of people from different backgrounds.

00:24:53.920 --> 00:24:56.540
Yeah, I found, I mean, definitely a lot of promising candidates.

00:24:56.680 --> 00:25:08.660
And also it's very just cool to talk about our company to people who are like kind of like very large established financial services companies and tell them about what we're doing.

00:25:09.620 --> 00:25:11.480
They kind of get the business problem.

00:25:11.880 --> 00:25:23.840
But it's also really cool to see that we're in kind of the same like we're in Startup Row, but like we're talking to the same people and kind of being involved in the Python community as some of these really large established players.

00:25:24.200 --> 00:25:30.360
Yeah, when you all describe what you're doing, I'm like, there's something with a long sales cycle. People don't go to your site and just put in the credit card.

00:25:31.540 --> 00:25:31.900
Very true.

00:25:33.740 --> 00:25:37.880
The laugh of, you have no idea how hard this is to sell to enterprise, right?

00:25:39.480 --> 00:25:47.780
Just the timeframe from first contact to like, yeah, we'll do it is I'm sure really, really large. I've been on that site a little bit and it's kind of mind blowing.

00:25:48.160 --> 00:25:50.080
All right, a couple of things to wrap things up here.

00:25:50.550 --> 00:25:51.980
Give us a look inside,

00:25:52.700 --> 00:25:54.660
like a tech architectural look

00:25:54.660 --> 00:25:55.540
of what you're all building.

00:25:55.760 --> 00:25:57.800
You know, it's got some Python stuff going on,

00:25:58.260 --> 00:26:00.160
but what kind of tech is at play

00:26:00.360 --> 00:26:01.380
without giving away secret sauce?

00:26:01.800 --> 00:26:04.740
Yeah, so generally like our whole backend is Python.

00:26:05.120 --> 00:26:09.600
So we use FastAPI for all our, you know, HTTP services,

00:26:10.480 --> 00:26:13.200
use Pydantic for models and data validation,

00:26:14.960 --> 00:26:16.800
use a lot of like, you know,

00:26:16.860 --> 00:26:22.980
when we use AI, we're usually calling or doing things from a Python client for all of our data

00:26:23.420 --> 00:26:29.620
pipelines. Yeah. And I mean, we obviously use like other technologies, but, you know, I mean,

00:26:29.840 --> 00:26:34.160
be it like, you know, pandas or, you know, NumPy for like kind of more of the analytic side and then

00:26:34.900 --> 00:26:42.100
different kinds of packages for doing OCR and data extraction and all that stuff is basically Python.

00:26:42.660 --> 00:26:58.520
Fun. It's a cool tech stack. It's really neat to work with these things these days. It's a lot of nice tools. So what's on the roadmap? You are host startup row. You've had a lot of conversations. Where are you leading? Maybe did also did some of these conversations influence you a bit on what you should focus on?

00:26:58.700 --> 00:27:28.560
That's a good question. So, well, we have some exciting fundraising announcements coming soon. And as part of that, we obviously are going to spend a lot of time doubling down on the product and delivering the best customer experience possible. So in terms of some things that we're excited about, and I'll put the business hat on and then the tech nerd hat on. But on the business hat side, we're working on some very interesting new features. So if you look at Tetrix, you can kind of think of it as a three layered cake. There's the data capability layer, there is the workflows layer, and then there's the inside.

00:27:28.620 --> 00:27:33.140
layer that we deliver to customers. The data layer, we've been spending a lot of time since

00:27:33.580 --> 00:27:36.800
the start of the company. And I think we're in a really, really good position there.

00:27:37.300 --> 00:27:41.520
And we really want to start double clicking on the workflow and the insights there. So a lot of our

00:27:41.640 --> 00:27:45.820
time is being spent for use cases specific to our customer on those two layers, whether it is

00:27:46.080 --> 00:27:50.820
being able to diligence, net new opportunities faster, whether it's being able to get flexible

00:27:51.100 --> 00:27:55.719
outputs in terms of investor memos and some of those things. So we'll be doubling down on those

00:27:55.740 --> 00:28:00.240
things. On the tech side, where we're spending a lot of time on the roadmap is scaling and

00:28:00.400 --> 00:28:05.380
optimization. As we grow as a company, the amount of data points we are seeing is way larger than

00:28:05.380 --> 00:28:09.760
we have in the past. And that obviously puts pressure on the systems itself, but is a very

00:28:10.000 --> 00:28:14.760
fun and interesting technical problem of how do you end up scaling that data. AI is moving super

00:28:14.980 --> 00:28:18.800
quickly. So all of us have the pulse on what's going on. And we're always thinking of ways to

00:28:18.960 --> 00:28:23.360
kind of leverage that if it makes sense within our product. So those are some of the many,

00:28:23.500 --> 00:28:27.200
many, many highlights that we have on the roadmap right now, but hopefully gives a good teaser of

00:28:27.300 --> 00:28:29.980
how we think through the product and how we think throughout on the tech side.

00:28:30.240 --> 00:28:36.820
Cool. That sounds very great. Very nice plans there. So final thought, as we wrap up our time

00:28:37.040 --> 00:28:42.040
together, what advice would you have for people who maybe are thinking to start a company or have

00:28:42.240 --> 00:28:47.900
just started or maybe pre-revenue or something along those lines who want to be on startup row?

00:28:48.260 --> 00:28:52.920
I guess we each can take this one. I'm happy to start us off. I think general advice for a startup,

00:28:53.120 --> 00:28:54.740
don't be a solution in search of a problem.

00:28:55.120 --> 00:28:56.640
It should be the flipped way around.

00:28:56.840 --> 00:28:58.780
So put in all the effort upfront

00:28:58.880 --> 00:29:00.460
in terms of really understanding your customers,

00:29:00.640 --> 00:29:01.620
the willingness to pay,

00:29:02.000 --> 00:29:03.020
what value are you providing

00:29:03.460 --> 00:29:04.500
relative to what's out there?

00:29:04.580 --> 00:29:05.680
What's your unique point of view?

00:29:06.060 --> 00:29:06.480
Those things.

00:29:06.620 --> 00:29:08.580
So that's the general word of advice there.

00:29:08.920 --> 00:29:10.540
And I think for startup role specifically,

00:29:10.780 --> 00:29:12.300
the advice is be very intentional

00:29:12.300 --> 00:29:13.880
of why you're showing up to PyCon.

00:29:14.440 --> 00:29:16.160
Everyone's time is precious, including yours.

00:29:16.240 --> 00:29:18.480
So make sure there is a true objective there.

00:29:18.960 --> 00:29:20.880
And one thing I didn't realize actually going in

00:29:20.940 --> 00:29:21.960
and wish I had known earlier,

00:29:22.180 --> 00:29:23.820
Lightning talks fill up really fast.

00:29:24.780 --> 00:29:28.320
So more tactically, make sure you sign up for lightning talks ahead of time.

00:29:29.100 --> 00:29:32.460
So that's my piece of advice generally and with regards to PyCon.

00:29:32.760 --> 00:29:33.320
Excellent, Grant.

00:29:33.640 --> 00:29:38.720
Yeah, so for me, I was at a startup prior to Tetrix, which did not succeed.

00:29:39.540 --> 00:29:42.680
And being part of Tetrix, which is doing really well.

00:29:42.920 --> 00:29:48.359
I think the key thing is having really concrete problems that you can solve for your customers

00:29:48.740 --> 00:29:51.120
and being able to, you know,

00:29:51.470 --> 00:29:54.040
be able to have a product that really alleviates

00:29:54.360 --> 00:29:56.660
a pain point that people are willing to pay money for

00:29:56.830 --> 00:29:58.740
versus like, this isn't like nice data to have,

00:29:58.960 --> 00:30:00.120
nice thing to do,

00:30:00.340 --> 00:30:01.500
but versus something that's like,

00:30:01.800 --> 00:30:04.760
wow, this really like revolutionizes the way I do my job

00:30:05.000 --> 00:30:05.980
or anything like that.

00:30:06.340 --> 00:30:08.500
And the fact that we've been able to, you know,

00:30:09.460 --> 00:30:11.340
you know, really scale up and gain like

00:30:11.660 --> 00:30:14.000
these really high profile customers

00:30:14.320 --> 00:30:16.439
and we're kind of like transforming their whole experience

00:30:16.460 --> 00:30:18.820
just means that we're solving a really important problem.

00:30:19.300 --> 00:30:20.740
And that's kind of like, you know,

00:30:20.750 --> 00:30:24.200
what I've seen at, you know, at Tetrix versus my prior company.

00:30:24.450 --> 00:30:26.060
And I'd say for startups coming to Startup Row,

00:30:26.340 --> 00:30:31.040
I mean, I think just be really like curious

00:30:31.280 --> 00:30:33.100
and open to different people and like, you know,

00:30:33.400 --> 00:30:36.260
see what, really be interested in what people are working on.

00:30:36.520 --> 00:30:38.980
You know, maybe someone comes, talks to you,

00:30:39.140 --> 00:30:40.480
they have no idea what you're doing,

00:30:40.860 --> 00:30:42.280
but you can at least like go and explain

00:30:42.510 --> 00:30:43.480
like how your company's working,

00:30:43.640 --> 00:30:44.180
how you're using Python,

00:30:44.440 --> 00:30:46.100
kind of connect from an engineering perspective.

00:30:46.580 --> 00:30:48.180
because a lot of those like engineering problems

00:30:48.360 --> 00:30:49.160
are kind of the same.

00:30:49.460 --> 00:30:51.760
I mean, it's all, you know, data and users

00:30:52.060 --> 00:30:54.440
and, you know, dealing with those types of problems.

00:30:54.740 --> 00:30:57.200
So just trying to educate,

00:30:57.460 --> 00:30:58.940
but also take in as much as you can.

00:30:59.060 --> 00:30:59.280
Cool.

00:30:59.640 --> 00:31:01.180
Well, let me just riff,

00:31:01.380 --> 00:31:03.080
just a moment before we close it out here.

00:31:03.520 --> 00:31:04.820
I've always said that it's,

00:31:05.480 --> 00:31:07.560
I know a lot of people are getting into tech

00:31:07.620 --> 00:31:08.460
or getting into programming.

00:31:08.520 --> 00:31:10.420
They're like, I want to be a software developer

00:31:11.480 --> 00:31:12.380
and I'm choosing APIs

00:31:12.660 --> 00:31:15.060
or I'm choosing, you know, data science or something.

00:31:15.120 --> 00:31:15.940
And that's great.

00:31:16.240 --> 00:31:24.940
But I think the real secret sauce of being super successful is having some specialty like investment banking and some programming skill.

00:31:25.330 --> 00:31:32.020
And if you're quite good at both and you intersect them, you're all of a sudden extremely powerful in a very, very small space, right?

00:31:32.180 --> 00:31:43.900
Like taking your knowledge of banking and turning it into this product with programming and AI skills puts it into a really rare space, which I think that's a really good way to lever up your career.

00:31:44.100 --> 00:31:46.740
as people are thinking like, oh, it's hard to get a job at a big tech company.

00:31:46.820 --> 00:31:50.760
It's like, well, maybe you don't check just chase just straight down the line of I'm just

00:31:50.880 --> 00:31:54.020
going to be a web developer, but some kind of intersection with your specialty or your

00:31:54.210 --> 00:31:54.300
passion.

00:31:54.580 --> 00:31:54.940
Yeah, exactly.

00:31:55.150 --> 00:31:58.740
And one of the great things about startup is like you're really close to the business

00:31:58.990 --> 00:32:03.320
problem and you see kind of like software and it's more targeted how you're going to

00:32:03.470 --> 00:32:07.900
solve like actual problems that your users are going to are facing and you're getting

00:32:07.900 --> 00:32:10.480
the feedback live and it's really rewarding environment.

00:32:11.420 --> 00:32:16.980
And also you get to learn a ton because you're basically working across the stack on every

00:32:17.160 --> 00:32:18.300
problem that you're getting.

00:32:18.660 --> 00:32:21.380
And it's really an awesome way to learn programming.

00:32:21.820 --> 00:32:22.320
Yeah, that's awesome.

00:32:22.380 --> 00:32:23.080
I love small companies.

00:32:23.520 --> 00:32:26.000
Now, Ned, you got the final comment for the show.

00:32:26.380 --> 00:32:27.160
Let's wrap up the segment.

00:32:27.500 --> 00:32:31.600
It's just the thing that we were saying reminded me of back in the day, there was this analogy

00:32:31.660 --> 00:32:35.680
of being a T-shaped developer where you cut across the stack and are deep in one thing

00:32:35.880 --> 00:32:36.360
technology-wise.

00:32:36.460 --> 00:32:38.780
I think now it's almost like you have two T's to what you say.

00:32:38.820 --> 00:32:42.180
You have like your technology T, but you also have your domain expertise T.

00:32:42.380 --> 00:32:48.300
And that's kind of the next metamorphosis, I guess, of how the engineering role is going to play out.

00:32:48.940 --> 00:32:51.460
But my final word is just thank you again to the Python community.

00:32:51.640 --> 00:32:53.020
Thank you to you, Michael, for having us.

00:32:53.780 --> 00:32:57.520
And we're really excited as a company at Tetrix here to be deepening our partnerships.

00:32:58.160 --> 00:33:03.700
And if anyone is looking for roles or wants to join an exciting startup, Tetrix is always on the lookout for the best and the brightest.

00:33:04.460 --> 00:33:06.800
And we'd love to continue the conversation as we continue to scale.

00:33:06.980 --> 00:33:08.300
Awesome. Well, congratulations.

00:33:08.640 --> 00:33:13.400
you guys for your success so far and wishing you more in the future talk to you later thank you so

00:33:13.410 --> 00:33:22.140
much michael talk to you thanks michael next up we have david from arcjet david welcome to talk

00:33:22.380 --> 00:33:27.160
python to me awesome to have you here for this startup row segment yeah thanks for having me

00:33:27.370 --> 00:33:31.780
it's gonna be fun it was nice to meet you at long beach i enjoyed the conference a lot how was it for

00:33:31.790 --> 00:33:36.419
you yeah it was good and the python community is great so always good to be there in person it's

00:33:36.440 --> 00:33:42.460
not my first one. So it's always good. It's a little rejuvenating, at least for me, to

00:33:42.860 --> 00:33:46.720
actually connect with the humans on the other side of the docs and projects and so on.

00:33:46.900 --> 00:33:51.220
Yeah, absolutely. Yeah, well, let's just start with who you are. Do a quick introduction for

00:33:51.280 --> 00:33:57.180
the listeners. Yeah, I'm David Mitton. I'm the founder and CEO of Artjet, which is a runtime

00:33:57.740 --> 00:34:05.459
application security startup. I also run a DevTools newsletter called Console.dev, where I review

00:34:05.480 --> 00:34:06.440
interesting developer tools.

00:34:07.400 --> 00:34:10.419
35,000 subscribers have been doing that for almost six years now.

00:34:10.720 --> 00:34:14.419
But the day job is helping developers secure their applications.

00:34:14.980 --> 00:34:15.379
Very cool.

00:34:15.700 --> 00:34:18.639
So I'll be sure to put your newsletter in the show notes.

00:34:18.800 --> 00:34:19.520
People can check it out.

00:34:19.740 --> 00:34:22.159
But security, you sure it's not just a fad?

00:34:23.320 --> 00:34:24.220
Yeah, everything is secure.

00:34:24.270 --> 00:34:24.899
No problems.

00:34:25.179 --> 00:34:26.000
We've solved security.

00:34:26.220 --> 00:34:26.879
You can all go home.

00:34:27.120 --> 00:34:27.520
Yeah, exactly.

00:34:28.060 --> 00:34:32.419
We have so many tools and we have so much more awareness, but we also have a lot more

00:34:32.440 --> 00:34:35.480
clever people trying to do bad things, right?

00:34:35.570 --> 00:34:37.940
Like just look at all the supply chain issues we're running into.

00:34:38.240 --> 00:34:40.860
Right. Supply chain is a real problem.

00:34:41.280 --> 00:34:43.080
And it's been ignored for a very long time.

00:34:43.500 --> 00:34:46.560
There's some really interesting tools that are coming up around that.

00:34:47.320 --> 00:34:50.679
Artjet sits in your application once you deploy into production.

00:34:50.909 --> 00:34:53.820
So we protect against attacks coming in, automation.

00:34:54.370 --> 00:34:57.760
We help you enforce budget controls, deal with prompt injection.

00:34:58.620 --> 00:35:01.580
But the supply chain is just as important.

00:35:02.100 --> 00:35:03.960
I kind of split it pre-prod and prod.

00:35:04.240 --> 00:35:06.040
And we're probably on to year end production.

00:35:06.280 --> 00:35:08.340
And then pre-prod is all the code scanning,

00:35:08.860 --> 00:35:10.620
dependency management, all those kinds of things.

00:35:10.940 --> 00:35:11.120
Yeah.

00:35:11.440 --> 00:35:13.800
Some of the worst attacks have actually been

00:35:13.820 --> 00:35:15.440
through this whole supply chain side.

00:35:15.520 --> 00:35:18.960
You probably remember long ago

00:35:19.160 --> 00:35:20.520
when the internet first came into existence,

00:35:21.080 --> 00:35:23.060
some of these systems didn't have passwords.

00:35:23.260 --> 00:35:24.040
It's just, what's your username?

00:35:24.460 --> 00:35:25.140
Oh, okay.

00:35:25.280 --> 00:35:27.360
Hi, welcome back, Dr. Falcon or whatever.

00:35:28.140 --> 00:35:29.780
And it seems so naive.

00:35:29.980 --> 00:35:30.740
Like, how could that be?

00:35:30.880 --> 00:35:36.460
But I think, you know, pip install something or npm install, it's almost, it's just inviting

00:35:36.630 --> 00:35:40.240
other people's code that you don't know to run on your computer without checks, at least

00:35:40.380 --> 00:35:41.240
traditionally, which is insane.

00:35:41.800 --> 00:35:45.500
So I don't want to go down that rat hole, but it's just, you know, the thought of that

00:35:45.840 --> 00:35:48.040
analogy there is like a little stark, I think.

00:35:48.410 --> 00:35:49.540
But let's talk about ArcGIS.

00:35:49.850 --> 00:35:53.480
So it is security that runs inside your code.

00:35:53.870 --> 00:35:56.920
Tell us, I know you gave a little bit of a hint there, but tell us a little bit more about

00:35:56.970 --> 00:35:57.060
it.

00:35:57.360 --> 00:36:03.880
developers have this really bad reputation for not caring about security and that was front of mind

00:36:04.260 --> 00:36:08.960
when i started the company because like you said there are so many security tools it's just they're

00:36:08.960 --> 00:36:14.180
not built for developers they're outside of your code they're outside of your editor they don't have

00:36:14.260 --> 00:36:20.200
any connection to what's going on inside your code base and so developers would often just delegate

00:36:20.500 --> 00:36:27.320
that to a third-party service or a different team and just like with devops where developers take

00:36:27.320 --> 00:36:33.000
responsibility for the applications that they're building, I think we can apply similar principles

00:36:33.360 --> 00:36:36.820
to security. Whereas if you give developers the right tools and the right principles,

00:36:37.470 --> 00:36:41.080
they can just think of security as another feature that they have to think about and build.

00:36:41.600 --> 00:36:45.920
And so that's what Artjet is. It's an SDK. You drop it into your application dependencies.

00:36:46.800 --> 00:36:53.000
We support Python, JavaScript, TypeScript, and Go. And then it gives you these building blocks to

00:36:53.020 --> 00:36:59.320
solve problems and the problem framing is critical because developers when they have to think about

00:36:59.540 --> 00:37:05.700
security often do it once as a problem they're not buying a waft they're not trying to buy code

00:37:05.900 --> 00:37:11.020
scanning static analysis tools they don't search for those things they search for i'm getting spam

00:37:11.240 --> 00:37:18.860
signups or someone's abusing my application and i need to apply budget controls these are specific

00:37:18.880 --> 00:37:20.100
developer-focused problems.

00:37:20.550 --> 00:37:22.900
And that's where we try and help developers.

00:37:23.010 --> 00:37:25.260
We give them building blocks for bot detection,

00:37:25.920 --> 00:37:28.520
for sign-up spam protection, for prompt injection.

00:37:29.080 --> 00:37:32.280
And more recently, we're creating these in a way

00:37:32.480 --> 00:37:34.140
that means you can just get your coding agent

00:37:34.640 --> 00:37:35.780
to solve it for you.

00:37:35.960 --> 00:37:37.040
That's what you've got on the screen there.

00:37:37.500 --> 00:37:39.380
And you just install our skill,

00:37:39.600 --> 00:37:41.000
and then you ask your coding agent,

00:37:41.460 --> 00:37:43.280
set a bar jet, and it will go through,

00:37:43.740 --> 00:37:46.500
examine your code, figure out what endpoints,

00:37:46.600 --> 00:37:51.560
what routes, what tool calls need protection, and then install OutJet and help you solve the

00:37:51.720 --> 00:37:57.640
security problem. That is really neat. I love how it knows, basically bootstraps itself onto the

00:37:57.770 --> 00:38:03.100
system by teaching the AI agents how to do things. I'm really starting to notice people deeply

00:38:03.340 --> 00:38:10.500
thinking about how to support AI agents that work alongside developers for their projects. I just

00:38:10.500 --> 00:38:16.480
had the great tables guys from Positon, and they've got a whole section on agents and skills and

00:38:16.500 --> 00:38:22.260
stuff so and CLI so that if you want to create documentation it's not just you create it but

00:38:22.580 --> 00:38:26.060
here's the tools that the agents can use to work this to help you create it as well and it sounds

00:38:26.060 --> 00:38:31.560
like you got something real similar we started with developer experience because the insight

00:38:32.040 --> 00:38:37.720
I had was that the best developer tool this is from from reviewing thousands of tools with console.dev

00:38:38.040 --> 00:38:42.580
but the best developer tools have the best developer experience so that means good documentation

00:38:42.600 --> 00:38:50.600
I mean, it means proper comments that your editor can surface as the IntelliSense type

00:38:51.420 --> 00:38:54.580
pop-ups that show up in your editor to give you hints by what you should implement,

00:38:55.100 --> 00:38:55.960
creating examples.

00:38:56.720 --> 00:39:03.420
And we started in 2023 before coding agents really became as dominant as they are now.

00:39:03.960 --> 00:39:09.060
But what we created by accident was this idea of agent experience, because good developer

00:39:09.080 --> 00:39:15.340
experience is very similar to what you need to do to have good agent experience and so today that

00:39:15.460 --> 00:39:21.100
means we have skills you can install we've got an mcp server so you can query your data or your agent

00:39:21.130 --> 00:39:27.500
can query your data and to help you understand what you need to do we've got a cli and we make

00:39:27.500 --> 00:39:35.540
it super easy for you to just point your coding agent at our docs or our lms.txt and then it will

00:39:35.520 --> 00:39:36.840
figure out what needs to be done.

00:39:37.040 --> 00:39:40.960
Like if you scroll up a little bit, the CTA that we have on the homepage, the

00:39:41.100 --> 00:39:45.200
first one is start with a prompt and you can go to the code if you want, but

00:39:45.340 --> 00:39:49.140
install the skill and then you tell your agent what to do.

00:39:49.600 --> 00:39:53.500
And where developers would often get stuck is you've done that initial

00:39:53.980 --> 00:39:55.360
installation or then what?

00:39:55.560 --> 00:39:59.260
Because that's in your code, you have all the context of who the user is and

00:39:59.360 --> 00:40:01.080
you can log rather than blocking.

00:40:01.660 --> 00:40:05.000
And when you deploy, your agent can follow along, can follow the logs.

00:40:05.180 --> 00:40:06.340
It can connect to Archer.

00:40:06.390 --> 00:40:07.620
It can pull all the data out.

00:40:08.300 --> 00:40:12.200
And then it can make suggestions to change the rules to avoid false positives and then

00:40:12.440 --> 00:40:13.220
commit them for you.

00:40:13.350 --> 00:40:18.260
And so what you get is this security partner that works with the Archer building blocks

00:40:18.390 --> 00:40:19.900
and helps you solve these security problems.

00:40:20.440 --> 00:40:20.780
I love it.

00:40:20.920 --> 00:40:22.820
That's a really great onboarding experience.

00:40:23.250 --> 00:40:28.340
I feel like there's this split of a lot of people having great experiences with AI agents

00:40:28.370 --> 00:40:29.880
and a lot of people not having them.

00:40:30.340 --> 00:40:34.280
And I know there's a lot going on there, but a lot of people not having great experiences,

00:40:34.480 --> 00:40:40.720
I think there's just steps they're missing or techniques they're missing, or they're choosing a really, really free, simple model.

00:40:41.140 --> 00:40:45.880
But things like this, like you just automatically run a single command to install the skills.

00:40:46.220 --> 00:40:48.400
And now AI is already better with this.

00:40:48.480 --> 00:40:50.080
It's really, really cool that you've thought through it.

00:40:50.260 --> 00:40:53.440
Obviously, having the AI work within your system.

00:40:53.660 --> 00:41:01.920
So when I'm using your SDK, is it actually doing AI at runtime or is AI sort of around the more static side?

00:41:02.000 --> 00:41:07.360
We use AI for the prompt injection detection side of the product.

00:41:08.000 --> 00:41:12.500
And that happens when you build in that particular building block into your code.

00:41:12.680 --> 00:41:13.760
But we have other components.

00:41:14.400 --> 00:41:18.020
We do PII detection, so we can detect email addresses, credit card numbers.

00:41:18.620 --> 00:41:19.980
And that happens entirely locally.

00:41:20.400 --> 00:41:25.880
We actually ship a WebAssembly sandbox with the SDK, which runs in process in your environment.

00:41:25.940 --> 00:41:30.700
And so when someone submits their credit card number by accident into your support form,

00:41:30.970 --> 00:41:34.480
we do that analysis entirely locally and it never leaves your environment.

00:41:34.880 --> 00:41:36.840
But to do something like prompt injection detection,

00:41:37.260 --> 00:41:40.580
that's where we run a load of specialized models on our cloud.

00:41:41.200 --> 00:41:44.520
And so the call goes out to us and then we're running AI behind the scenes.

00:41:45.300 --> 00:41:48.860
The difference is just the kind of thing you want to protect against.

00:41:49.060 --> 00:41:51.860
Like if you're doing a form submission, then you want us to respond within,

00:41:52.920 --> 00:41:56.080
we set an SLA of 20 milliseconds to respond to those.

00:41:56.260 --> 00:41:57.240
So you would never notice.

00:41:57.550 --> 00:41:59.500
And if it's inside the WebAssembly sandbox,

00:41:59.800 --> 00:42:00.840
it's less than a millisecond.

00:42:01.180 --> 00:42:02.500
But if you're going to an LLM,

00:42:02.650 --> 00:42:04.900
then it may take a couple of seconds to get a response.

00:42:05.190 --> 00:42:06.600
And that's normal as expected.

00:42:06.980 --> 00:42:10.020
So we have a little bit of leeway to do our own analysis.

00:42:10.720 --> 00:42:12.320
Typically, that's around 200 milliseconds.

00:42:12.800 --> 00:42:16.120
Yeah, if you add half a second to someone else's LLM call,

00:42:16.480 --> 00:42:18.460
it probably, you couldn't tell the difference.

00:42:18.860 --> 00:42:19.700
It could just be, oh, well,

00:42:19.750 --> 00:42:21.380
the LLM's a little busy right now, right?

00:42:21.720 --> 00:42:22.660
Yeah, very cool.

00:42:22.860 --> 00:42:26.300
Okay, so why start this company? Why start ArcJet?

00:42:26.540 --> 00:42:32.800
I started it because I felt that the developer tooling for security just wasn't there.

00:42:33.300 --> 00:42:39.360
And we had gone through in the previous few years, kind of 2020 onwards, this revolution,

00:42:39.590 --> 00:42:43.280
certainly in the JavaScript ecosystem. And then it started going over into

00:42:44.120 --> 00:42:48.160
Python and into the other ecosystems as well, that you would get these amazing tools,

00:42:48.300 --> 00:42:49.680
You get amazing cloud platforms.

00:42:49.810 --> 00:42:53.640
You get amazing CLIs and tools for developers to write code.

00:42:53.840 --> 00:42:57.500
But it was five or 10 years behind in security.

00:42:57.870 --> 00:43:03.560
And I thought we could bring this new approach, the developer experience to security in your code.

00:43:03.960 --> 00:43:06.380
Something that's actually built for developers to try and solve problems.

00:43:06.860 --> 00:43:12.820
And I thought we could build out a platform company to solve all these different problems.

00:43:13.580 --> 00:43:15.420
But developers need these building blocks.

00:43:15.600 --> 00:43:18.520
And so that's why we've kind of split the product up into these different areas.

00:43:18.900 --> 00:43:22.120
So you can come to us for one thing, like prompt injection detection,

00:43:22.680 --> 00:43:27.620
but you probably also want rate limiting to implement budget controls for your AI tool.

00:43:28.260 --> 00:43:32.480
You want bot protection to stop automation attacks against your application.

00:43:32.560 --> 00:43:33.640
You want PAI detection.

00:43:34.060 --> 00:43:36.100
So all of these things start to compose together.

00:43:36.600 --> 00:43:42.460
You can use them individually or you can bring them into a multi-rule security policy.

00:43:43.140 --> 00:43:44.800
But that's the reason for creating this.

00:43:44.980 --> 00:43:46.260
Seems like a great idea to me.

00:43:46.720 --> 00:43:48.760
So Startup Pro, how'd you end up there?

00:43:49.500 --> 00:43:53.460
Yeah, I was following the Icon blog for a while

00:43:53.780 --> 00:43:56.500
because I knew we were going to do a Python SDK

00:43:57.780 --> 00:44:00.500
and wanted to start getting into the community.

00:44:01.000 --> 00:44:02.400
Python's actually the first programming language

00:44:02.940 --> 00:44:07.660
and I really learned and I've been writing it since 2008, 2009.

00:44:07.940 --> 00:44:09.820
So back in the Python 2 era.

00:44:10.520 --> 00:44:11.320
But we started out.

00:44:11.320 --> 00:44:12.280
The two to three wars.

00:44:13.140 --> 00:44:14.440
You're a veteran of the two to three wars.

00:44:14.600 --> 00:44:15.200
Yeah, I know.

00:44:15.900 --> 00:44:20.140
Luckily, I kind of stopped writing Python for a bit with my last startup.

00:44:20.740 --> 00:44:25.320
And then when I came back to writing code, it had already gone on to the 3, version 3.

00:44:25.480 --> 00:44:28.400
So I kind of skipped that pain.

00:44:29.780 --> 00:44:33.000
But we started with JavaScript and we just had a JavaScript SDK

00:44:33.300 --> 00:44:37.920
because all the new applications were being built using JavaScript and TypeScript.

00:44:38.660 --> 00:44:42.260
As AI started to come onto the scene properly

00:44:42.500 --> 00:44:45.300
kind of end of 2024 into 2025,

00:44:45.960 --> 00:44:47.980
Python really started to shine again

00:44:48.320 --> 00:44:51.520
because it's been native in the data community,

00:44:51.740 --> 00:44:53.120
the data science community for a long time.

00:44:53.520 --> 00:44:56.500
And it's where all the AI work is happening.

00:44:56.830 --> 00:45:00.320
And it started to be used for the AI backend APIs again.

00:45:00.700 --> 00:45:02.760
And we just built our own backend.

00:45:03.300 --> 00:45:04.980
I'm using the Open Inference Protocol

00:45:05.580 --> 00:45:07.879
and that allows us to run different models

00:45:07.940 --> 00:45:10.340
but have an abstracted layer internally

00:45:10.710 --> 00:45:13.980
because our actual core infrastructure is written in Go.

00:45:14.400 --> 00:45:16.100
That's what I moved to from Python to Go.

00:45:17.220 --> 00:45:19.800
But we've decided we were going to release the Python SDK,

00:45:20.240 --> 00:45:22.080
which came out at the beginning of this year.

00:45:22.900 --> 00:45:26.440
And that was just in time for the startup row application

00:45:27.200 --> 00:45:28.260
and to attend PyCon

00:45:28.540 --> 00:45:30.700
and start getting it in the hands of Python developers.

00:45:31.120 --> 00:45:31.360
Nice.

00:45:31.920 --> 00:45:34.060
Is that a little bit like Open Router and those other things,

00:45:34.520 --> 00:45:35.600
this middle layer?

00:45:36.080 --> 00:45:36.800
It's similar, yeah.

00:45:36.920 --> 00:45:40.700
The challenge with the models is they all require different things.

00:45:40.780 --> 00:45:41.460
They have different inputs.

00:45:42.240 --> 00:45:45.460
And if you're going to run multiple models, which is what we do,

00:45:45.560 --> 00:45:48.500
we kind of run the prompt injection detection in parallel

00:45:48.800 --> 00:45:50.880
across multiple models and then compare the results.

00:45:51.860 --> 00:45:54.460
And for our backend to have a consistent API

00:45:54.820 --> 00:45:57.760
where we get the result out, we want to get the token count,

00:45:58.340 --> 00:46:00.120
we want to monitor the latency,

00:46:00.640 --> 00:46:04.660
we created a thin layer that uses the open inference protocol,

00:46:05.120 --> 00:46:06.700
which is what our Go code connects to.

00:46:07.100 --> 00:46:10.140
And then that abstracts away the differences of the different models.

00:46:10.900 --> 00:46:15.100
And that makes it a lot easier to just build our internal client server architecture.

00:46:15.440 --> 00:46:15.880
Makes sense.

00:46:16.200 --> 00:46:17.720
So how did Startup Row go?

00:46:17.800 --> 00:46:18.780
Did you make some good connections?

00:46:19.560 --> 00:46:20.760
Did you feel like it was worth going?

00:46:21.080 --> 00:46:21.760
Yeah, it was great.

00:46:22.420 --> 00:46:29.000
And it allowed us to get in front of the community with the support of the PyCon organizers.

00:46:29.600 --> 00:46:35.180
It was interesting comparing to other conferences because to date, we've been mainly at JavaScript conferences.

00:46:35.940 --> 00:46:51.940
And the type of questions that we get really shows the understanding of building AI workflows, building AI APIs, building the data models and the data workflows behind the front end applications, which are still typically built in JavaScript.

00:46:52.540 --> 00:46:54.260
And just the questions are very different.

00:46:54.270 --> 00:47:00.240
And you could utilize a different type of engineer at PyCon than you do a JavaScript conference.

00:47:00.740 --> 00:47:02.460
Yeah, there's some really clever people there.

00:47:02.520 --> 00:47:07.480
I always feel like I'm talking to some really smart people in the room when I'm interacting with the PyCon attendees.

00:47:07.980 --> 00:47:11.740
So you talked a bit about the tech going on behind the scenes.

00:47:12.060 --> 00:47:14.500
It's interesting that you have Go, I think, there.

00:47:15.500 --> 00:47:21.620
It really seems like that's server-side type of programming first is what Go is for.

00:47:22.020 --> 00:47:29.140
I think people think Go Rust is kind of similar, but Rust is a little more lower-level operating system type of thinking,

00:47:29.300 --> 00:47:32.280
I think, whereas Go is all about async and programming.

00:47:33.160 --> 00:47:36.520
What are your thoughts? I know you're not doing it, so there's no reason to switch over.

00:47:36.520 --> 00:47:41.420
What are your thoughts about using some of the modern Python API things for your backend?

00:47:41.780 --> 00:47:47.960
We use FastAPI and we use an SGI app that's hosted on Modul for our AI inference.

00:47:48.860 --> 00:47:52.260
Modul gives us the GPUs and the hosting environment auto scales.

00:47:52.600 --> 00:47:55.720
And then our applications are just deployed in containers.

00:47:56.500 --> 00:48:04.800
The Go API, the Python SDK that our customers use is Go because it's a gRPC API.

00:48:05.440 --> 00:48:12.600
And Go has the best libraries available for gRPC because gRPC is written by Google and Go is written by Google.

00:48:12.680 --> 00:48:14.200
So they have the best APIs.

00:48:14.620 --> 00:48:16.380
I mean, yeah, they were built to go hand in hand.

00:48:16.440 --> 00:48:20.720
I feel like gRPC never really spread beyond Go.

00:48:21.080 --> 00:48:25.220
I mean, there's some options in Python to use it and some other languages, but it's kind of like,

00:48:25.500 --> 00:48:27.200
It still feels proof of concept to me.

00:48:27.680 --> 00:48:27.980
I don't know.

00:48:28.120 --> 00:48:29.480
I've looked at gRPC as well.

00:48:29.540 --> 00:48:32.680
I'm like, that'd be pretty neat, but no, just do JSON or something.

00:48:32.980 --> 00:48:34.540
Yeah, we did it because of the performance.

00:48:35.080 --> 00:48:36.900
So we talked a little bit about the latency.

00:48:37.460 --> 00:48:41.840
And if we're sitting in your request path, we want to respond as quickly as we possibly can.

00:48:42.200 --> 00:48:45.880
Like ignoring the prompt injection detection, which adds a couple of hundred milliseconds.

00:48:46.460 --> 00:48:51.500
When we're doing bot detection, when we're doing rate limiting, we want to give you a response within just a couple of milliseconds.

00:48:51.540 --> 00:48:59.280
And so when you install our Python SDK, it opens an HTTP2 socket that maintains persistent connection with our edge network.

00:48:59.730 --> 00:49:05.320
And that removes some of the latency because you don't have to establish a connection every time.

00:49:05.510 --> 00:49:12.280
But then we're making RPC calls using gRPC to minimize the latency because the wire protocol is binary.

00:49:12.690 --> 00:49:17.220
So it doesn't have to do the heavy work that you do when you're parsing JSON.

00:49:17.300 --> 00:49:22.960
and that just makes it a lot more performant and means that when the communication is happening we

00:49:23.100 --> 00:49:27.580
can we have backwards compatibility with the protocol layer it just gives us a lot of these

00:49:27.800 --> 00:49:33.140
nice properties and that allow us to have a stable but perform an api yeah it makes a lot of sense

00:49:33.580 --> 00:49:39.240
i'd probably use msgspec these days if i was really really worried about packet i think gRPC is

00:49:39.340 --> 00:49:43.839
also great but like if i was had to fit it into the python space i'd probably go message spec

00:49:44.020 --> 00:49:47.820
I think that's probably the tightest, most binary packing you can get these days.

00:49:48.220 --> 00:49:48.660
Yeah, definitely.

00:49:48.920 --> 00:49:53.500
There are some interesting options now, but we support multiple languages.

00:49:54.160 --> 00:49:55.580
So we started with JavaScript.

00:49:56.020 --> 00:49:59.000
There's some really good generators for gRPC in JavaScript.

00:50:00.300 --> 00:50:04.960
And we've just done a Go SDK as well, and we're going to go to other languages.

00:50:05.700 --> 00:50:11.800
So we looked at a few different options, and this was 2023, so it's a few years now.

00:50:12.460 --> 00:50:13.700
You had a lot of time to think about it.

00:50:13.800 --> 00:50:14.920
no one was going outside anymore.

00:50:15.920 --> 00:50:17.280
What a weird time.

00:50:17.680 --> 00:50:21.520
So give us, I want to maybe just get your perspective here

00:50:21.680 --> 00:50:23.320
since you've lived on both sides of these fences.

00:50:23.800 --> 00:50:25.980
How is JavaScript, TypeScript security

00:50:26.800 --> 00:50:28.360
different than Python right now?

00:50:28.600 --> 00:50:30.120
That is a good question.

00:50:30.480 --> 00:50:35.780
I think PyPI hasn't had the same problems as npm has.

00:50:36.100 --> 00:50:38.180
And it's probably a factor of its popularity

00:50:38.780 --> 00:50:41.000
with where all the attention is.

00:50:42.140 --> 00:50:43.039
That's going to change

00:50:43.360 --> 00:50:46.580
because these package registries are really set up

00:50:46.890 --> 00:50:48.140
almost as volunteer organizations.

00:50:49.020 --> 00:50:52.120
And certainly PyPI is run by the Python Foundation.

00:50:52.500 --> 00:50:54.520
So that is a kind of formal connection there.

00:50:55.640 --> 00:50:58.900
But they don't get the funding of a megacorp

00:50:59.120 --> 00:51:02.340
that should be able to invest huge amounts in security.

00:51:02.720 --> 00:51:04.500
Of course, npm is run by a megacorp.

00:51:04.510 --> 00:51:05.940
It's run by GitHub, which is Microsoft.

00:51:06.150 --> 00:51:09.020
And so they should have the resources to really improve security.

00:51:09.980 --> 00:51:11.999
But that just hasn't...

00:51:12.020 --> 00:51:13.680
Still, they're struggling under all the attacks.

00:51:13.980 --> 00:51:14.640
They're struggling.

00:51:14.860 --> 00:51:19.420
They just haven't allocated the resources it really deserves.

00:51:20.600 --> 00:51:22.040
And this is just a problem with the architecture

00:51:22.260 --> 00:51:23.460
because they were built in an era

00:51:23.700 --> 00:51:26.120
when this just wasn't an attack factor.

00:51:26.480 --> 00:51:29.260
It was just so much trust around open source.

00:51:29.440 --> 00:51:30.900
It's like, it's built for the good.

00:51:31.180 --> 00:51:32.360
They put it out there for you to use.

00:51:32.460 --> 00:51:34.260
It has a license, just install it.

00:51:34.920 --> 00:51:36.380
Well, maybe that's not the only problem.

00:51:37.080 --> 00:51:37.780
Yeah, that's right.

00:51:38.000 --> 00:51:39.580
It's just they provide a very basic service.

00:51:39.840 --> 00:51:42.080
It's basically just hosting your code in a certain way,

00:51:42.500 --> 00:51:43.380
but that's been abused.

00:51:43.700 --> 00:51:47.440
And it's multiple orders of magnitude increase in traffic.

00:51:48.140 --> 00:51:50.020
And that just means you're going to get bad actors

00:51:50.420 --> 00:51:51.480
and they're going to exploit it.

00:51:51.660 --> 00:51:51.900
Yeah.

00:51:52.100 --> 00:51:54.520
I honestly think that with all the agentic AI

00:51:54.740 --> 00:51:56.920
helping people write little bits of code here and there

00:51:57.940 --> 00:52:00.360
and stuff like the security supply chain thing

00:52:00.380 --> 00:52:00.940
that we're talking about,

00:52:01.080 --> 00:52:02.100
there's going to be a lot more vendoring.

00:52:02.320 --> 00:52:04.720
And if you only need one or two functions out of a library,

00:52:04.840 --> 00:52:06.260
maybe you could just have Cloud write it

00:52:06.460 --> 00:52:08.620
and you don't have to depend on anything and worry about it.

00:52:09.000 --> 00:52:13.880
yeah it's we'll see where it goes in the next five years agreed yeah that's why google's

00:52:13.930 --> 00:52:18.820
always run things they always vendor all their dependencies and now i think if it's just a basic

00:52:18.980 --> 00:52:23.060
dependency that's not really doing that much you can get your coding agent to do it for you

00:52:23.330 --> 00:52:28.220
i one of the things that i always talk to our customers about is that well you can write your

00:52:28.220 --> 00:52:32.739
own frame limiting library you can do that pretty easily and use redis but can you build your own

00:52:32.760 --> 00:52:39.280
bot detection and deal with all the kind of the arms race of keeping up with automation that's

00:52:39.280 --> 00:52:43.480
where we think we add value and i think that's the way we're going to see what dependencies is most

00:52:43.620 --> 00:52:47.800
of them you're going to write yourself or get your ai to do it but there's going to be a few key

00:52:47.960 --> 00:52:52.380
things that really you shouldn't be doing yourself like crypto cryptography not cryptocurrency

00:52:53.700 --> 00:52:57.140
that's going to be the that's going to be the questions like what is the crypto equivalent

00:52:57.700 --> 00:53:02.720
yep 100 if you see people doing 100 from scratch their own crypto that's pretty much a

00:53:02.740 --> 00:53:06.500
very big one, a red flag. So speaking of, you know, what people are going to be doing,

00:53:07.040 --> 00:53:11.180
what's the roadmap? Let's close it out with the roadmap for ArcGET. Where are things going from

00:53:11.200 --> 00:53:15.960
what you have now? We're going to add more language support. And it's not just a case of

00:53:16.280 --> 00:53:21.420
code genning a library because we have the WebAssembly component in there that does a lot of

00:53:21.520 --> 00:53:27.020
the security analysis in your environment. And that requires a bit of engineering work for each

00:53:27.040 --> 00:53:33.300
platform. In JavaScript, WebAssembly is native within Node, within the runtime, so we have to

00:53:33.610 --> 00:53:38.440
write the bindings, but it's relatively straightforward. In Python, we use WASM time,

00:53:38.570 --> 00:53:46.840
which is an open source runtime for Python. And in Go, we use one called WASERO, but different

00:53:47.520 --> 00:53:52.680
ecosystems have different packages because often WebAssembly is not natively built into the runtime.

00:53:53.300 --> 00:53:59.760
And so that's where a lot of the work goes, is making sure that WebAssembly works in a way that is performant and native.

00:54:00.340 --> 00:54:02.220
So we're going to add more language support.

00:54:02.700 --> 00:54:03.300
That's the main thing.

00:54:03.600 --> 00:54:03.780
Okay.

00:54:04.100 --> 00:54:06.280
Yeah, that's, I mean, got a solid foundation.

00:54:06.500 --> 00:54:11.260
Now you just want to make it available to all the different users and developers of different platforms.

00:54:12.380 --> 00:54:14.080
You know, it would be pretty interesting.

00:54:14.600 --> 00:54:21.340
In Python, we've got the CFFI and the C bindings and all these different interop things and Rust through PyO3.

00:54:21.680 --> 00:54:26.880
It'd be kind of interesting to just have a native execution of Wasm in the runtime without

00:54:26.980 --> 00:54:28.700
some kind of adaptive layer type of thing.

00:54:28.700 --> 00:54:29.440
I think that would be cool.

00:54:29.620 --> 00:54:34.560
Definitely, because I want to have absolutely nothing to do with C in a security focused

00:54:35.000 --> 00:54:35.140
application.

00:54:35.640 --> 00:54:37.540
I can imagine that.

00:54:37.800 --> 00:54:38.360
Yeah, definitely.

00:54:38.520 --> 00:54:43.420
It should be built into the runtime, but then we had the problem of minimum Python versions

00:54:43.700 --> 00:54:44.620
and all those kinds of things.

00:54:44.800 --> 00:54:50.380
And I think Python 3 people do typically stay more up to date, but it's still a problem when

00:54:50.400 --> 00:54:53.780
you require people to be on the very latest version of the runtime.

00:54:54.400 --> 00:54:55.080
Yeah, 100%.

00:54:55.080 --> 00:54:59.040
A lot of people just take what comes with Ubuntu or something, which is usually a year behind.

00:54:59.400 --> 00:55:02.920
All right, David, I appreciate you taking this time to chat with us.

00:55:03.060 --> 00:55:05.680
Congratulations on ArcJet and good luck for the future.

00:55:06.000 --> 00:55:06.180
Great.

00:55:06.520 --> 00:55:06.740
Thanks a lot.

00:55:07.080 --> 00:55:07.260
Yeah.

00:55:07.490 --> 00:55:07.620
Bye.

00:55:09.880 --> 00:55:12.480
Our next startup is femoral.dev.

00:55:13.090 --> 00:55:14.660
And we're going to be talking to Chinmaya.

00:55:16.400 --> 00:55:17.780
Chinmaya, welcome to Talk Python.

00:55:18.060 --> 00:55:18.720
Excellent to have you here.

00:55:18.980 --> 00:55:20.080
Hey, super nice to be here.

00:55:20.260 --> 00:55:23.420
Fun times hanging out in PyCon, meeting up on Startup Row.

00:55:23.940 --> 00:55:25.520
That was a really cool setup there.

00:55:26.000 --> 00:55:26.560
Yeah, it was really good.

00:55:26.560 --> 00:55:28.740
It was a pretty awesome opportunity to be there.

00:55:28.960 --> 00:55:31.040
So glad we made that happen.

00:55:31.340 --> 00:55:31.960
I can imagine.

00:55:32.000 --> 00:55:37.040
I was talking to one of the organizers and the success rate of startups on Startup Row

00:55:37.160 --> 00:55:37.620
is really high.

00:55:38.380 --> 00:55:38.960
Hoping to follow suit.

00:55:38.960 --> 00:55:39.620
I hope for it.

00:55:40.060 --> 00:55:40.300
Exactly.

00:55:41.120 --> 00:55:42.140
Let's keep it rolling, right?

00:55:42.420 --> 00:55:46.020
Well, let's actually begin by having you do a quick introduction for the listeners.

00:55:46.500 --> 00:55:46.860
Sure.

00:55:47.300 --> 00:55:47.360
Yeah.

00:55:48.240 --> 00:55:48.720
I'm Chinmaya.

00:55:49.000 --> 00:55:50.460
I'm the founder of Femeral.

00:55:50.780 --> 00:55:55.020
We're like a hosting platform for Python-based web apps.

00:55:55.620 --> 00:55:58.240
And yeah, just excited to be here.

00:55:58.640 --> 00:55:58.960
Awesome.

00:55:59.320 --> 00:56:02.440
I think hosting's been around forever, right?

00:56:02.540 --> 00:56:04.640
Like cPanel land and all that weird stuff.

00:56:04.880 --> 00:56:09.400
But it seems like there's a lot of opportunity to create better opportunities, better developer

00:56:09.680 --> 00:56:12.120
user experiences, and also cost, right?

00:56:12.400 --> 00:56:15.380
Yeah, that's kind of our angle, right?

00:56:15.460 --> 00:56:18.100
is like, obviously you can go and spin up a server.

00:56:18.290 --> 00:56:21.020
Pretty much every company under the sun offers that service.

00:56:22.040 --> 00:56:24.500
But, you know, we really want to focus on the developer experience,

00:56:25.120 --> 00:56:28.560
making it as seamless as possible to actually get your code

00:56:28.890 --> 00:56:30.300
hosted into a place where it's live

00:56:30.700 --> 00:56:34.980
and without having to, you know, deal with the manual steps

00:56:35.580 --> 00:56:38.300
and extra problem surface area that come with,

00:56:38.530 --> 00:56:39.920
you know, potentially managing your own hosting.

00:56:41.040 --> 00:56:44.460
And like you mentioned, the cost, that's also a factor for us

00:56:44.480 --> 00:56:48.180
because, you know, especially when you have persistently provisioned compute, you really

00:56:48.340 --> 00:56:54.140
have to size and scale your servers such that they don't, you know, break your wallet, break

00:56:54.150 --> 00:56:54.660
your bank account.

00:56:55.900 --> 00:56:58.300
And so you're kind of dealing with two problems, right?

00:56:58.460 --> 00:57:02.640
It's like, is my server or set of servers actually going to be able to handle all of this traffic?

00:57:03.100 --> 00:57:05.900
And at the same time, am I going to be able to pay for all of this?

00:57:06.820 --> 00:57:12.640
Yeah, that's both the promise and the potential downfall of the cloud is it's easy to set up

00:57:12.680 --> 00:57:13.040
a few things.

00:57:13.140 --> 00:57:15.500
they won't cost very much unless they take off and then maybe they do.

00:57:15.850 --> 00:57:15.940
Yeah.

00:57:16.070 --> 00:57:20.080
And then, you know, you're spending all this dev time, you know, trying to manage all that

00:57:20.280 --> 00:57:21.220
infra on top of that.

00:57:21.300 --> 00:57:25.800
So, you know, if you equate, you know, potentially your own developer time or your team's developer

00:57:26.000 --> 00:57:29.280
time to money, you know, that that's another cost that you have to think about.

00:57:29.600 --> 00:57:32.960
What about AI and specifically vibe coding?

00:57:32.970 --> 00:57:37.400
I'm not a huge fan of vibe coding as a concept, although it's super fun to just come up with

00:57:37.400 --> 00:57:40.460
a crazy idea and send the agent off and go, I wonder what it does.

00:57:40.750 --> 00:57:40.880
Right.

00:57:40.980 --> 00:57:54.960
But as a form of engineering, I'm not a huge fan of it, but I do think that we're in an emerging world where there's many people who have programmed in a sense and they have an app and then they're just completely like, well, how do I get it on the internet?

00:57:55.600 --> 00:57:57.360
You know, because they're not really developers, right?

00:57:57.760 --> 00:58:02.300
And there's like, I don't Linux, I don't DevOps, but I still need it on the internet.

00:58:02.860 --> 00:58:03.800
How do I go about that?

00:58:03.980 --> 00:58:04.080
Right?

00:58:04.390 --> 00:58:04.680
What do you think?

00:58:04.760 --> 00:58:11.460
Yeah, I mean, that's, you know, a massive cohort that's, you know, kind of emerging into the new

00:58:11.700 --> 00:58:16.780
space of builders, right? And, you know, they want to host their stuff in a place where it's live,

00:58:16.940 --> 00:58:20.820
and they don't have to, you know, deal with the extra, you know, headache of figuring out,

00:58:21.060 --> 00:58:24.920
like you mentioned, what is all this Linux stuff? They kind of just want to be like, hey, I vibe

00:58:25.000 --> 00:58:29.400
coded this Flask app, this Django app, this FastAPI app, and it's really cool. And I share with all

00:58:29.500 --> 00:58:34.360
my friends, how do I do that? Right? Where do I even start? Like, what is a server?

00:58:34.720 --> 00:58:38.060
These types of questions are really a big blocker, right?

00:58:38.240 --> 00:58:42.660
And that we do serve those people as well, quite well.

00:58:42.960 --> 00:58:45.460
Yeah, I don't want to position you initially as only serving VibeCoders.

00:58:45.460 --> 00:58:49.200
It just, it seems to me like that's a whole nother area of people who really could be

00:58:49.520 --> 00:58:51.260
served from a simplified deployment experience.

00:58:51.700 --> 00:58:54.640
But there's others, you know, I'm thinking data science, honestly.

00:58:55.160 --> 00:58:59.640
There's a ton of data scientists who have built something amazing, but they're not really

00:59:00.240 --> 00:59:02.180
DevOps software engineer side.

00:59:02.320 --> 00:59:14.820
They come from more from the science side and they've done really cool work, but it's a big step to go from I've got my notebooks running to now I have a FastAPI app to now I have it on Linux.

00:59:15.740 --> 00:59:21.700
Yeah, no, there's a ton of like beginner cohorts, I would say, that, you know, are served really well.

00:59:22.600 --> 00:59:29.060
For us, we're like mainly focused on, I would say, two main cohorts of people that we see as our ICP.

00:59:29.520 --> 00:59:34.080
One is like smaller development and startup teams, right, that have a Python stack.

00:59:34.720 --> 00:59:38.360
And, you know, they want to spend most of their time in the business logic and actually

00:59:38.640 --> 00:59:42.160
serving their customers' needs and, you know, focusing on their customer feedback rather

00:59:42.260 --> 00:59:44.700
than managing their internal hosting solutions.

00:59:45.200 --> 00:59:48.760
So they, you know, wouldn't have to, you know, hire someone to do that or spend their dev

00:59:48.900 --> 00:59:50.540
time, you know, on those tasks.

00:59:51.020 --> 00:59:56.220
And then the other cohort are, you know, agencies and consultants, kind of by the same token,

00:59:56.320 --> 01:00:00.760
but they're served a little differently by one of our core features,

01:00:01.010 --> 01:00:03.640
which we kind of haven't talked about yet, which is the managed cloud.

01:00:04.380 --> 01:00:04.820
Yeah, tell us.

01:00:05.460 --> 01:00:09.000
Let's take a step back and maybe position Femoral around.

01:00:09.480 --> 01:00:14.720
On one hand, we have infrastructure to the service, EC2, DigitalOcean, Hetzner, VPCs, whatever.

01:00:14.870 --> 01:00:18.060
And on the other, maybe you just upload some code somewhere.

01:00:18.960 --> 01:00:20.040
Where do you all live?

01:00:21.120 --> 01:00:24.420
I think I may have missed a couple words in there because of internet,

01:00:24.680 --> 01:00:41.400
But I am going to say we fall kind of in the platform as a service side of things where you want a place to host your apps and you just want to be able to throw them up there without having to deal with these servers manually.

01:00:42.060 --> 01:00:42.440
Yeah, exactly.

01:00:43.120 --> 01:00:44.260
You got the gist of it.

01:00:44.310 --> 01:00:47.440
So basically, it's sort of a continuous deployment type thing.

01:00:47.600 --> 01:00:49.660
Create a certain branch, like a production branch or whatever.

01:00:50.060 --> 01:00:50.960
Connect GitHub to it.

01:00:51.220 --> 01:00:51.840
Push that branch.

01:00:52.300 --> 01:00:52.600
Off you go.

01:00:52.670 --> 01:00:54.260
Like merge a PR and it's live, right?

01:00:54.600 --> 01:00:59.080
Yeah, pretty much. And then all of your code, without having to dockerize or containerize,

01:00:59.620 --> 01:01:04.620
because of that build pipeline we built, will get built and will then deploy it onto our managed

01:01:04.820 --> 01:01:12.000
cloud, which uses our serverless orchestrator to scale up and scale down and manage the amount of

01:01:12.940 --> 01:01:18.360
instances slash containers slash VMs that are running your code relative to the amount of

01:01:18.500 --> 01:01:23.219
traffic that's coming and the amount of resources that your code base is using at any given moment

01:01:23.220 --> 01:01:26.800
will be properly provisioned to match that traffic.

01:01:26.980 --> 01:01:29.640
So that's kind of like what we do in an end-to-end sense.

01:01:30.160 --> 01:01:33.280
Code uploaded, we build, we deploy, then we scale.

01:01:33.760 --> 01:01:35.980
So those are all the things we take care of.

01:01:36.240 --> 01:01:36.780
Yeah, awesome.

01:01:37.060 --> 01:01:38.700
I see it says now in early access.

01:01:39.260 --> 01:01:41.160
How do I get early access?

01:01:41.640 --> 01:01:44.980
Yeah, you just click that button that says get started

01:01:45.100 --> 01:01:45.720
and you sign up.

01:01:45.840 --> 01:01:49.360
Yeah, there's no, really, there's no gating here.

01:01:49.740 --> 01:01:50.280
Yeah, got it.

01:01:50.540 --> 01:01:51.820
I have talked to some folks who are like,

01:01:51.840 --> 01:01:54.840
yeah, not yet, but you can apply and hopefully, so we'll see.

01:01:55.220 --> 01:01:56.380
Yeah, we're wide open.

01:01:57.200 --> 01:02:01.600
We would love for anyone who has something they'd like to deploy to come check it out.

01:02:01.860 --> 01:02:02.100
Sweet.

01:02:02.460 --> 01:02:02.780
Startup Row.

01:02:03.200 --> 01:02:03.600
What do you think?

01:02:03.720 --> 01:02:04.160
How'd you get there?

01:02:04.300 --> 01:02:06.100
Why do you put the time and energy into that?

01:02:06.400 --> 01:02:08.140
Yeah, Startup Row, it's pretty awesome.

01:02:08.440 --> 01:02:15.360
You know, I was in contact with some of the organizers and, you know, I don't think I really

01:02:16.380 --> 01:02:20.340
had a strong sense of what Startup Row would be like before I actually got there.

01:02:21.420 --> 01:02:23.580
given that it was also my first PyCon at the same time.

01:02:23.670 --> 01:02:25.420
So there's a lot of new happening.

01:02:26.430 --> 01:02:29.560
But I would say I did it, you know,

01:02:29.630 --> 01:02:32.760
to just kind of get more involved in the community, right?

01:02:33.020 --> 01:02:35.620
Like as the company were, you know, made for Python dev.

01:02:35.720 --> 01:02:38.600
So naturally I want to be, you know, involved in the community.

01:02:39.000 --> 01:02:42.940
And then once we got there, it was pretty spectacular, you know,

01:02:43.280 --> 01:02:46.280
got to meet and talk to like so many developers

01:02:46.660 --> 01:02:47.780
and people with different problems.

01:02:48.070 --> 01:02:49.360
And, you know, people would come up and say,

01:02:49.520 --> 01:02:52.440
oh my God, this is something that I really need right now.

01:02:52.540 --> 01:02:53.740
And then you'd have people that come up and be like,

01:02:54.420 --> 01:02:55.720
this is so foreign to me.

01:02:56.040 --> 01:02:57.700
I don't even understand why I would need this.

01:02:57.860 --> 01:03:00.440
So there's like, you just get the whole spectrum

01:03:00.900 --> 01:03:02.480
and it gives you a really good perspective.

01:03:02.760 --> 01:03:03.140
That's cool.

01:03:03.240 --> 01:03:04.120
I'm glad you had a good experience.

01:03:04.400 --> 01:03:06.300
I don't go to PyCon every single year,

01:03:06.340 --> 01:03:08.740
but when I do, I always really enjoy being there.

01:03:09.220 --> 01:03:11.280
It's great to just be with people in the community

01:03:11.420 --> 01:03:13.060
doing really smart and interesting things.

01:03:13.520 --> 01:03:16.620
Yeah, no, I learned a lot more about the community

01:03:16.780 --> 01:03:18.720
than I knew before I got there.

01:03:19.060 --> 01:03:22.620
Yeah. I think it's also, as a startup, it must be interesting to talk to people and go,

01:03:22.690 --> 01:03:26.680
I don't think I need you. What is this? Why do I need this? Because either it helps you focus in

01:03:26.780 --> 01:03:31.720
on your ideal customer and say you're actually outside of that slice of the world, or position

01:03:31.830 --> 01:03:35.840
your messaging a little bit, right? Like one of the big stories of startups is talk to customers,

01:03:36.040 --> 01:03:40.660
talk to customers, like so much easier said than done though. Yeah, no, definitely. You're right

01:03:40.670 --> 01:03:47.320
about that. I would say we were able to validate our ICP because the most interest we got was from

01:03:47.340 --> 01:03:52.780
smaller startup teams and from agencies slash freelancers or consultants that were, you know,

01:03:53.120 --> 01:03:56.280
dealing with clients and had all these staging environments that they had to manage and all this

01:03:56.440 --> 01:04:01.780
extra infra. So like kind of validated that in a sense, but, you know, I guess at the same time

01:04:02.460 --> 01:04:06.740
invalidated outside of our ICP simultaneously because of those conversations I talked about

01:04:06.840 --> 01:04:11.920
earlier. I hadn't really thought about the agency side, but a lot of what happens with the agency is

01:04:12.040 --> 01:04:15.500
somebody comes in and builds something really nice and they get it working and then they hand it off

01:04:15.520 --> 01:04:18.940
to somebody who's presumably not quite as familiar with the tech

01:04:19.110 --> 01:04:20.740
because otherwise they might have just built it themselves.

01:04:21.280 --> 01:04:23.840
So the concept of, look, you just pushed to this branch.

01:04:24.220 --> 01:04:24.460
Yeah.

01:04:24.720 --> 01:04:26.360
That's got to go over well as a handoff.

01:04:26.700 --> 01:04:28.020
Right. It's great for a handoff.

01:04:28.050 --> 01:04:30.040
And it's also great for managing, you know,

01:04:30.220 --> 01:04:32.200
like mock-ups and staging environments, right?

01:04:32.460 --> 01:04:35.180
Like say you have, you know, a number of clients

01:04:35.480 --> 01:04:39.060
and you send them a mock-up or two or a live demo every week.

01:04:39.600 --> 01:04:41.900
And then you have to manage kind of this extra staging environment

01:04:42.500 --> 01:04:43.980
for every single one of these clients.

01:04:44.340 --> 01:04:49.160
it becomes a lot more infrastructure work for you as a company compared to like, say,

01:04:49.240 --> 01:04:52.140
you're just a startup and you just have one product and, you know, you need one staging

01:04:52.340 --> 01:04:56.640
environment for that one product. Right. So like for agencies, this kind of infowork can kind of

01:04:57.210 --> 01:05:01.700
increase pretty rapidly as the clients increase per client almost. Yeah. Right. Interesting. And

01:05:01.800 --> 01:05:05.660
then the scaling, right. Between each client. Right. So there's like, you know, I could get into it,

01:05:05.760 --> 01:05:11.080
but we only have so much time. Indeed. So how did you sort of told me how your experience was,

01:05:11.140 --> 01:05:14.200
but as a startup, how was startup row for you?

01:05:14.540 --> 01:05:16.400
Yeah, I mean, it was great.

01:05:16.660 --> 01:05:18.760
We, you know, we've made some really good connections

01:05:19.560 --> 01:05:22.780
for potential partners going forward, potential customers.

01:05:23.080 --> 01:05:25.280
So I would say it really helped grow the business

01:05:26.120 --> 01:05:28.080
and gave us, you know, like, I guess I already said this,

01:05:28.180 --> 01:05:31.000
but gave us perspective on like what certain,

01:05:31.560 --> 01:05:34.240
you know, personas perceive of the product,

01:05:34.480 --> 01:05:36.140
you know, given their context and their background.

01:05:36.560 --> 01:05:39.060
I found it very interesting to just walk around the expo floor

01:05:39.360 --> 01:05:43.100
and kind of just get a sense of what have people come to promote, right?

01:05:43.150 --> 01:05:46.340
You get one time a year to come talk about something and what is their,

01:05:46.760 --> 01:05:48.240
what does their banner say?

01:05:48.670 --> 01:05:49.520
Who decided to come?

01:05:49.570 --> 01:05:50.780
Who decided not to come?

01:05:50.830 --> 01:05:54.160
And yeah, it's really, it's a neat experience.

01:05:54.540 --> 01:05:54.860
Definitely.

01:05:55.600 --> 01:05:58.720
Tech, how much do you want to talk about tech behind Femoral?

01:05:58.860 --> 01:06:01.800
I think it'd be interesting, but I don't want to make you give away secrets.

01:06:02.230 --> 01:06:04.180
So tell us what you're comfortable sharing.

01:06:04.540 --> 01:06:05.280
Yeah, it's fun.

01:06:05.940 --> 01:06:17.680
So I guess I can kind of talk about the functional experience of what the tech enables, which is that, you know, we built this build pipeline.

01:06:18.340 --> 01:06:25.540
And essentially what we're doing, in a sense, is, you know, at a high level, going through your code base and figuring out like, okay, what are the tools you're using?

01:06:25.740 --> 01:06:26.660
What are the libraries you're using?

01:06:26.900 --> 01:06:27.740
What do we need to package?

01:06:27.980 --> 01:06:28.780
What do we need to build?

01:06:29.240 --> 01:06:31.340
And, you know, like that's quite straightforward, right?

01:06:31.460 --> 01:06:32.540
You're just kind of parsing code.

01:06:33.040 --> 01:06:34.240
It's largely a solved problem.

01:06:35.380 --> 01:06:42.320
But then, you know, I guess the more technically interesting side of things is the like serverless orchestration that we've written in the managed cloud.

01:06:42.840 --> 01:06:56.340
And so that's kind of based off of, you know, these like fast starting VMs that we use and some kind of, you know, way to take advantage of, you know, really fast cold starts with those fast starting VMs.

01:06:56.680 --> 01:07:02.920
Right. So like, you know, when someone does have something deployed serverlessly and it is scaled to zero, well, when they hit it, they don't want to be sitting there for a minute.

01:07:03.260 --> 01:07:06.920
right waiting for some instance to spin up right so like a really interesting cost level right

01:07:07.040 --> 01:07:11.720
because if you want to keep one running so it's not a cold start but that that that costs money

01:07:12.260 --> 01:07:16.280
but if you want to turn it off maybe it's well i don't want to wait 30 seconds for the first request

01:07:16.500 --> 01:07:21.500
right right and that's like really uh what we wanted to avoid and what generally happens with

01:07:21.620 --> 01:07:25.140
persistent compute so that's like one of the reasons that we as a company decided to build

01:07:25.280 --> 01:07:30.220
on serverless compute um in order to like you know drive this experience where you can have all these

01:07:30.240 --> 01:07:33.820
things deploy and they've all scaled to zero, but you're not, you know, waiting on a cold start when

01:07:33.940 --> 01:07:38.260
you do actually want to use something. And that's kind of powered by these fast starting VMs that

01:07:38.360 --> 01:07:43.920
we've kind of built everything on top of. Okay. What can I host there? Look at your website. It

01:07:44.000 --> 01:07:49.300
sounds like the standard Python stack sort of thing. Yeah. It's like, I mean, that's kind of

01:07:49.320 --> 01:07:55.920
like just the biggest subset of the set of things we can deploy on Ephemeral. Mostly it's anything

01:07:55.940 --> 01:08:01.460
written in python exposed with an api and that you wouldn't need gpu compute for because right now we

01:08:01.560 --> 01:08:07.400
don't have for gpu compute for many reasons that that's gpu is really interesting it's as soon as

01:08:07.400 --> 01:08:10.800
you go down that path it's like well you could start at a thousand dollars and go up from there

01:08:11.020 --> 01:08:17.080
rather than ten you know it's like yeah it's tough to offer a reasonable price point with gpus yeah

01:08:17.200 --> 01:08:23.460
i'm sure that it is um so one thing i see the web frameworks and they all look real common of

01:08:23.460 --> 01:08:26.660
Of course, if you can do all those three, then you can do others, I imagine.

01:08:27.100 --> 01:08:28.960
What's the story for data access?

01:08:30.040 --> 01:08:32.299
Databases, Postgres, SQLite, Mongo, others?

01:08:32.299 --> 01:08:35.920
Yeah, so I guess this kind of feeds into our roadmap,

01:08:36.380 --> 01:08:40.560
which is we're now working on building serverless Postgres,

01:08:40.650 --> 01:08:43.839
like managed serverless Postgres, to add right into Femoral.

01:08:44.060 --> 01:08:46.560
So you deploy your serverless web app,

01:08:46.880 --> 01:08:48.960
and right next to it, you deploy your serverless Postgres.

01:08:49.420 --> 01:08:50.160
They talk to each other.

01:08:50.480 --> 01:08:51.420
It's all in the same platform.

01:08:51.940 --> 01:08:53.319
Everything's managed under the same billing.

01:08:53.460 --> 01:08:54.460
So it's really straightforward.

01:08:54.799 --> 01:08:57.200
So yeah, right now, if you were to deploy in Femoral,

01:08:57.620 --> 01:08:59.580
your database would live outside of our compute.

01:09:00.040 --> 01:09:02.319
But we are very soon bringing that

01:09:02.589 --> 01:09:04.180
into the scope of what Femoral does.

01:09:04.299 --> 01:09:04.600
Got it.

01:09:04.730 --> 01:09:05.960
Do I get to pick my cloud?

01:09:06.009 --> 01:09:10.120
Do I say EC2 or like, sorry, AWS or Azure

01:09:10.620 --> 01:09:12.120
or DigitalOcean or whatever?

01:09:12.230 --> 01:09:15.220
Do I choose that then pick up a managed database

01:09:15.450 --> 01:09:16.020
in that location?

01:09:16.240 --> 01:09:18.580
Or how do I relate those two things?

01:09:18.960 --> 01:09:22.620
Yeah, so you can choose to locate your database.

01:09:22.779 --> 01:09:28.759
like when our database managed progress is offered, you can choose to locate that in whichever region,

01:09:29.799 --> 01:09:34.420
basically any AWS region. Although there are obviously other hyperscalers that we could offer

01:09:34.450 --> 01:09:41.080
that in right now. And in terms of the actual web app compute itself, that is not necessarily

01:09:42.339 --> 01:09:50.719
provisioned into a specific region. But we are working on how we might communicate that to the

01:09:50.620 --> 01:09:55.700
user. Sounds good. And I guess anything else on the roadmap that you want to touch on, or is that

01:09:55.890 --> 01:10:00.080
pretty much covered the database? Yeah. I mean, basically, right. You have the stateless compute,

01:10:00.250 --> 01:10:03.900
and then obviously you need some states somewhere, right? So that's all we're working on, right,

01:10:03.900 --> 01:10:10.260
is the Postgres. People want, obviously, Redis, some kind of key value. So managed Redis will

01:10:10.760 --> 01:10:16.920
probably come with Postgres. Yeah. Shinmaya, congrats on starting Femoral and best of luck

01:10:16.940 --> 01:10:20.560
to you guys and nice to meet you at PyCon. Thanks for coming on the show. Yeah, for sure. Nice

01:10:20.620 --> 01:10:27.580
meeting you too. See you later. Now we meet Capiccio in Beyond, its co-founder. Hey, Beyond,

01:10:27.760 --> 01:10:31.400
welcome to Talk Python To Me. Yeah, thank you so much, Michael. Really great to be on the show.

01:10:31.740 --> 01:10:37.160
Yeah, it's fabulous to have you be part of our startup row segment, stroll down startup lane,

01:10:37.380 --> 01:10:43.280
if you will. I think it's such a neat idea that PyCon, the PyCon organizers, Jason and Shea and

01:10:43.300 --> 01:10:48.340
everyone else put that together. And so it's just a neat look into what's up and coming in the Python

01:10:48.680 --> 01:10:55.180
space. So we're going to talk about Capicio. Capicio. Yeah. Capicio. I love it. This is your

01:10:55.540 --> 01:11:00.640
business. And we're going to dive into why you want Startup Row and all those things. But before we do,

01:11:00.860 --> 01:11:05.599
quick introduction. Who are you? Yeah, sure. Thank you. So my name is Beyond Denote. I am the founder

01:11:05.620 --> 01:11:14.120
of Capicio, we refer to ourselves as the authority layer for AI agents. So identity policy, basically

01:11:14.390 --> 01:11:20.340
to be able to secure agentic environments so that they're ready for production and your

01:11:20.500 --> 01:11:25.160
SecOps teams aren't freaking out when you're trying to deploy agents to prod.

01:11:25.340 --> 01:11:30.719
It's really tricky, right? We've got this non-deterministic thing running, but it's supposed

01:11:30.660 --> 01:11:35.660
to be operating in a professional or legally structured environment, right?

01:11:36.040 --> 01:11:36.120
Yeah.

01:11:36.380 --> 01:11:36.480
Yeah.

01:11:36.480 --> 01:11:37.780
It's a massive challenge.

01:11:38.560 --> 01:11:43.800
It's blocking a lot of POCs right in its tracks at the moment, or even some organizations

01:11:43.980 --> 01:11:45.880
from not even considering AI solutions.

01:11:46.720 --> 01:11:49.520
So we're trying to bridge that gap and solve that problem.

01:11:49.800 --> 01:11:54.980
You know, I'm reminded of some stat that was probably just made up or whatever, or very

01:11:55.220 --> 01:11:58.300
vague, like 97% of all AI projects fail.

01:11:59.360 --> 01:12:02.000
And I have no idea what that even means.

01:12:02.220 --> 01:12:06.620
Does that mean like they tried to add AI to an email client and they just, it couldn't

01:12:06.640 --> 01:12:07.040
be added?

01:12:07.240 --> 01:12:11.160
Like, no, my email client just has a very bad representation of AI in it.

01:12:11.560 --> 01:12:13.080
Yeah, I have no idea.

01:12:13.580 --> 01:12:14.280
Yeah, no, no.

01:12:14.500 --> 01:12:15.900
I've seen that stat as well.

01:12:16.060 --> 01:12:21.880
I think the source was some MIT paper that ended up maybe not being quite as well researched.

01:12:22.000 --> 01:12:23.420
So I don't know what the real stat is.

01:12:23.600 --> 01:12:25.940
Maybe we're somewhere close, but yeah.

01:12:26.140 --> 01:12:28.620
Yeah, I think it's a much higher level of success.

01:12:28.900 --> 01:12:33.100
but things like what you all are building are sort of key to that success, right?

01:12:33.400 --> 01:12:38.900
Yeah, absolutely. It's a whole new ecosystem. I mean, if we go back to the early 2000s,

01:12:38.910 --> 01:12:44.180
we invented this thing called the internet and we had all these great ideas, but there was a lot

01:12:44.180 --> 01:12:49.040
of infrastructure still missing to be able to realize that. And at the time we didn't really

01:12:49.300 --> 01:12:55.840
know what infrastructure we really needed yet. With the whole agentic era, I think we've hit a reset

01:12:55.860 --> 01:13:01.220
button on a lot of that except we're a lot more technologically mature so i think we teams know

01:13:01.380 --> 01:13:06.060
what they need and what they're missing and we're in this build race to to be able to close those

01:13:06.280 --> 01:13:11.800
gaps interesting i do think it's just absolutely the wild wild west is not the right term but it's

01:13:11.820 --> 01:13:16.660
just an unknown we don't know what we need we don't even necessarily to some degree know what

01:13:16.720 --> 01:13:22.180
we don't know for some of these products but it's changing fast i was sort of thinking about that

01:13:22.100 --> 01:13:26.660
that one when i threw out when your response to that that stat i threw out is like how much of

01:13:26.660 --> 01:13:33.120
that is based on 2024 ai you know what i mean right it moves so fast i mean even six months ago and

01:13:33.180 --> 01:13:38.660
you're looking at a different beast you know it's uh it's incredible the iteration pace is so fast

01:13:39.080 --> 01:13:45.400
yeah so why'd you start capuchio yes uh good question so um i obviously had been following

01:13:45.450 --> 01:13:51.100
the ai space um you know jumping on everything that that i could to be able to learn more and get

01:13:51.080 --> 01:13:51.660
into the space.

01:13:52.620 --> 01:13:54.340
But I wanted to do something meaningful.

01:13:54.420 --> 01:13:56.020
I wanted something infrastructure level.

01:13:56.460 --> 01:13:59.940
And then when Google released the first iteration

01:14:00.240 --> 01:14:03.120
of the A2A protocol, the agent to agent protocol,

01:14:03.380 --> 01:14:06.420
I think it was somewhere around March last year, March 2025,

01:14:08.780 --> 01:14:10.240
a few light bulbs started going off.

01:14:10.340 --> 01:14:14.320
Because here we were creating a new standard for agents

01:14:14.740 --> 01:14:18.940
not to communicate with MCP servers or human agent.

01:14:19.160 --> 01:14:23.320
This was agent to agent communication, which we knew

01:14:23.440 --> 01:14:26.520
was coming, but the concept blew my mind.

01:14:27.270 --> 01:14:30.400
And then looking at DeepMind, Google DeepMind also

01:14:30.540 --> 01:14:33.340
released a few papers on intelligent delegation,

01:14:34.540 --> 01:14:35.300
agent to agent delegation.

01:14:35.980 --> 01:14:39.060
So looking at that, from where we were,

01:14:39.180 --> 01:14:41.960
we're just using basically LLMs and chatbots

01:14:42.240 --> 01:14:45.720
to a layer where we had agents self-orchestrating

01:14:46.690 --> 01:14:47.860
and trying to do that at scale.

01:14:48.620 --> 01:14:51.160
That's where, like I explained, early 2000s internet,

01:14:51.500 --> 01:14:52.640
we're missing a lot of infrastructure.

01:14:53.600 --> 01:14:55.900
And for now, being able to see that realization

01:14:56.160 --> 01:14:58.400
for that vision, there's a lot of infrastructure missing.

01:14:58.740 --> 01:15:00.980
So that's where I started building,

01:15:01.800 --> 01:15:03.660
particularly around the trust layer,

01:15:04.460 --> 01:15:05.340
the authority layer,

01:15:06.120 --> 01:15:08.840
trying to make sure that agents can communicate

01:15:09.400 --> 01:15:10.980
securely, safely together,

01:15:11.220 --> 01:15:12.740
and that we can facilitate that

01:15:12.920 --> 01:15:14.840
with all the missing layers that we have right now.

01:15:15.000 --> 01:15:17.440
Well, it's definitely a challenging problem, right?

01:15:17.820 --> 01:15:23.140
We used to write tests or have security scanners, but now, what are some of the new challenges,

01:15:23.340 --> 01:15:28.040
I guess, that you see out there that are different than prior stages?

01:15:28.620 --> 01:15:30.100
Yeah, good question.

01:15:30.420 --> 01:15:35.180
So one of the challenges has to do with identity.

01:15:35.860 --> 01:15:40.140
When I started working on the problem, I was focused more on setting guardrails for AI

01:15:40.480 --> 01:15:45.380
agents, helping them to communicate together, being able to learn more about each other,

01:15:46.440 --> 01:15:51.600
But being able to grant every agent an identity was very important.

01:15:52.540 --> 01:16:04.320
Right now, it seems like the current trend is that we're trying to expand the known models around IAM into agentic identity, which is sort of a band-aid right now.

01:16:04.320 --> 01:16:09.800
But one of the biggest restrictions is that those are usually within a singular domain.

01:16:10.320 --> 01:16:22.400
And cross-domain open web communication, being able to extend that identity concept to really the future that we have with agentic AI on the open web, that becomes a big challenge.

01:16:23.360 --> 01:16:30.820
And then along with that, of course, we have what we're referring to as the trust layer.

01:16:31.800 --> 01:16:34.940
Just like in human society, we have people we interact with.

01:16:35.520 --> 01:16:44.360
And the first thing we even do before we buy a new pair of shoes or a restaurant is we check reviews, you know, on the merchant, on the actual product.

01:16:45.300 --> 01:16:49.340
And that mechanism doesn't really exist for agents right now.

01:16:49.560 --> 01:16:58.040
So in a way, there's some of those primitives that are missing to be able to really scale that Agentech future up to full speed.

01:16:58.400 --> 01:16:59.180
Going to be weird, right?

01:16:59.400 --> 01:17:00.100
Yeah, absolutely.

01:17:00.460 --> 01:17:06.400
All these things, you'll have to just drop in and check on your team of agents and see how things are going.

01:17:06.880 --> 01:17:07.200
You know what?

01:17:07.650 --> 01:17:15.360
I can easily see a product manager or some kind of manager agent that you go and work with.

01:17:15.640 --> 01:17:18.640
And then it's like, look, how's the whole thing going?

01:17:18.840 --> 01:17:19.680
How's the team looking?

01:17:20.290 --> 01:17:22.400
And then you scope it out.

01:17:22.500 --> 01:17:23.880
You all go work on this.

01:17:23.880 --> 01:17:24.520
Get back to me later.

01:17:24.620 --> 01:17:25.680
It's going to be weird.

01:17:26.280 --> 01:17:28.680
Yeah, we're definitely heading to that future.

01:17:28.760 --> 01:17:40.800
I mean, we've maybe seen it in movies before, and it seemed like so far off, you know, but we're all definitely going to have our personal agent that just kind of knows what's going on.

01:17:41.160 --> 01:17:45.140
And I don't think it's as far off as what a lot of us are imagining.

01:17:45.840 --> 01:17:48.060
No, I don't either. It's going to be odd.

01:17:48.320 --> 01:17:50.440
Okay, so Startup Pro, that's where we met.

01:17:51.120 --> 01:17:54.600
And while you all were at PyCon, why apply to Startup Pro?

01:17:55.020 --> 01:17:55.480
How'd you get there?

01:17:55.760 --> 01:17:56.640
Yeah, no, thanks.

01:17:56.720 --> 01:17:57.140
Good question.

01:17:58.340 --> 01:18:16.700
So I have to be honest here because like a lot of folks who are now using Python and fluent in Python, I sort of backed into the Python community because around the rise of AI, obviously Python, I mean, we can refer to it as the native language for AI pretty much, right?

01:18:16.800 --> 01:18:21.100
So started using a lot of Python each and every day.

01:18:22.100 --> 01:18:24.800
And then this product that we built obviously has the SDK.

01:18:24.960 --> 01:18:29.680
It has an MCP plugin for MCP server harnesses as well.

01:18:31.180 --> 01:18:33.500
And then one day I got pinged by Jason.

01:18:34.600 --> 01:18:36.720
You know, Jason and Shay organizing Startup Row.

01:18:37.420 --> 01:18:41.400
And he gets pinged and he's like, hey, man, have you heard about Startup Row on PyCon?

01:18:41.560 --> 01:18:42.840
I think you should really apply.

01:18:43.400 --> 01:18:44.880
And I was like, wow, okay.

01:18:45.980 --> 01:18:46.360
Checked it out.

01:18:46.660 --> 01:18:52.040
learn about PyCon I'd never been before and Startup Row and it just seemed like a great

01:18:52.270 --> 01:18:56.840
opportunity so I put the application in but like a lot of things you put in the application like

01:18:57.020 --> 01:19:03.220
whatever you know let's see what comes of it and yeah it was a little while later got pinged to say

01:19:03.440 --> 01:19:10.280
congratulations so that's how we landed on Startup Row at PyCon and man what a what a gift

01:19:10.420 --> 01:19:15.140
what a privilege it really was a it was an awesome experience. Was that your first PyCon attendance?

01:19:15.340 --> 01:19:33.180
It was. It was my first PyCon. I've been to a lot of other conferences. Even my partner who was with me at the event, he was just saying how he's worked so many other conferences and the vibe was just so different.

01:19:33.340 --> 01:19:36.760
You know, when you're talking to people at PyCon, everybody was chill.

01:19:37.120 --> 01:19:38.160
You were talking builder.

01:19:38.540 --> 01:19:40.120
It was builder to builder conversations.

01:19:40.640 --> 01:19:42.380
Hey, you know, what are you working on?

01:19:42.980 --> 01:19:44.280
How are you solving this problem?

01:19:45.200 --> 01:19:47.780
And there were just a lot of real conversations.

01:19:48.240 --> 01:19:49.140
The vibe was great.

01:19:49.440 --> 01:19:50.340
I really enjoyed it.

01:19:50.500 --> 01:19:53.720
Yeah, I've been to a lot of different technology conferences as well.

01:19:53.860 --> 01:19:54.960
And it is certainly unique.

01:19:55.480 --> 01:19:56.640
And I mean that in a good way.

01:19:56.880 --> 01:19:57.980
Yeah, yeah, no, absolutely.

01:19:58.460 --> 01:20:02.060
So one of the things I think is really critical for startups is getting feedback,

01:20:02.560 --> 01:20:07.400
talking to potential or active customers. And the advice is, well, you really got to talk to

01:20:07.660 --> 01:20:12.580
customers. It's so hard to do. But on Startup Pro, you get to kind of iterate on that over and over.

01:20:12.900 --> 01:20:17.100
Did you get some good feedback? Yeah, absolutely. We weren't sure how many...

01:20:18.320 --> 01:20:22.760
This was sort of a big validation test for us because we were curious about the timing of the

01:20:22.960 --> 01:20:28.440
market. Is the market ready to have this conversation? And it was interesting from

01:20:28.460 --> 01:20:33.440
developers point of view most to be honest were like oh yeah we got to do something about this we

01:20:33.580 --> 01:20:38.640
haven't kind of got there yet um but then from from the folks who were working inside larger

01:20:38.880 --> 01:20:43.400
enterprises or the ones who have very advanced solutions they were already at the point where

01:20:43.520 --> 01:20:49.080
they they totally got it like wow okay this is awesome we need to check this out um so i mean

01:20:49.160 --> 01:20:53.260
we're following up now we got a quite a few design partner opportunities which is the point that we're

01:20:53.320 --> 01:20:56.520
we're at right now we're looking to work with teams who are experiencing this problem

01:20:57.240 --> 01:21:03.120
And, you know, where they can start running our product and find where we need to extend it to make it work for them.

01:21:03.320 --> 01:21:04.080
What about the tech?

01:21:04.800 --> 01:21:09.400
Are you giving us a peek inside what core technologies you all are using?

01:21:09.740 --> 01:21:10.240
Yeah, sure.

01:21:10.420 --> 01:21:10.680
Absolutely.

01:21:11.920 --> 01:21:20.060
So because it's an infrastructure project and there's cryptographic verification of identities, a lot of handshakes like that going on.

01:21:20.560 --> 01:21:24.220
We've actually built the core of it in Go.

01:21:24.400 --> 01:21:25.960
It's a Golang, you know, library.

01:21:26.340 --> 01:21:35.780
And then we have all the wrappers and all the stuff that would benefit from native latency in whatever target SDK language.

01:21:36.080 --> 01:21:39.640
So Python being the main one, that's the only one we have right now.

01:21:42.100 --> 01:21:47.760
So basically, what ends up happening, the flow is you can use our SDK, one line of code.

01:21:47.820 --> 01:21:51.780
We literally, that's why we had it on our banner at our booth.

01:21:52.140 --> 01:21:57.540
one line of code to be able to connect, register an identity for that agent for an MCP server.

01:21:58.460 --> 01:22:03.520
That's then cryptographically verified because the private key is stored right on the agent,

01:22:03.720 --> 01:22:09.200
right on the server. And then with that identifier, you can now be able to create policy

01:22:09.900 --> 01:22:16.340
around the tools and around the agent. What tools is it allowed to invoke? What are blocked?

01:22:17.020 --> 01:22:20.600
what group policy, what organizational policy belongs

01:22:20.980 --> 01:22:23.360
to this agent or server.

01:22:23.900 --> 01:22:25.440
And the neat part in how we designed it

01:22:25.680 --> 01:22:29.620
is those are all policies that are compiled into OPA bundles

01:22:29.920 --> 01:22:33.000
and are actually cached right to the agent or right to the server.

01:22:33.260 --> 01:22:37.140
So to be able to respond to requests is super fast.

01:22:37.280 --> 01:22:41.600
It's a sub 10 millisecond because usually when we use security,

01:22:41.660 --> 01:22:43.240
we think, oh, well, there goes my latency.

01:22:43.960 --> 01:22:45.400
So that was a problem we wanted to solve.

01:22:45.640 --> 01:22:53.460
But that in essence is as far as we've gotten in our roadmap right now, we are working on a full public RFC stack.

01:22:54.000 --> 01:23:00.200
So our next two RFCs, we're working on the intent layer, which is a whole other fun conversation.

01:23:00.350 --> 01:23:02.980
But we're determined to try and crack that as well.

01:23:03.100 --> 01:23:03.700
Yeah, yeah. Very cool.

01:23:04.010 --> 01:23:08.960
You're not the only startup on Startup Row building the core server side components with Go.

01:23:09.320 --> 01:23:11.440
Yes. And that's what we found out.

01:23:11.640 --> 01:23:18.320
You know, when we were coming to PyCon, thinking Python community, we were like, okay, don't talk about Go.

01:23:18.540 --> 01:23:19.040
This is Python.

01:23:20.440 --> 01:23:21.140
Don't say anything.

01:23:22.440 --> 01:23:26.400
And then we got some questions like you just asked, you know, were they really pressed?

01:23:26.760 --> 01:23:28.680
And they were like, okay, no, that makes sense.

01:23:28.730 --> 01:23:29.160
We get it.

01:23:29.300 --> 01:23:33.740
That's like, you're like this product or that product, that product that uses a similar pattern, you know?

01:23:33.880 --> 01:23:37.560
So, yeah, it wasn't an unusual way to implement it.

01:23:37.780 --> 01:23:43.120
Python has a really interesting performance story and relationship with other native build

01:23:43.340 --> 01:23:44.980
technologies or native languages.

01:23:45.480 --> 01:23:51.020
Like, for example, Python itself runs on CPython, which is primarily implemented in C, not Python.

01:23:51.500 --> 01:23:54.720
A lot of the ways that Python is made fast these days is through Rust.

01:23:55.360 --> 01:23:59.600
So when you end up at a performance critical section, it's like there's a layer of Python

01:23:59.740 --> 01:24:00.760
and then it's Rust, right?

01:24:00.960 --> 01:24:06.140
Like my web server, the application server for my website and my course website, all the

01:24:06.220 --> 01:24:06.360
things.

01:24:06.880 --> 01:24:11.800
It's built in Rust and then it just delegates out to Python, out to Flask, basically.

01:24:12.080 --> 01:24:17.140
So I think Python people are more than other technologies used to.

01:24:17.440 --> 01:24:23.460
So there's this core of something and then this sort of mix of choose the right thing at the right place.

01:24:23.680 --> 01:24:25.080
Yeah, yeah, no, absolutely.

01:24:25.360 --> 01:24:28.200
And Rust was a consideration for me.

01:24:28.380 --> 01:24:32.240
I came from a C background and Go just really intrigued me.

01:24:32.500 --> 01:24:36.020
So we ended up building it and Go in and it's been a good result.

01:24:37.239 --> 01:24:53.180
But yeah, I mean, especially when you're doing things like cryptographic verification and you're doing a lot of stuff over again, you wanting to scale to support many different languages, it does make sense to choose a core and then build around that.

01:24:53.260 --> 01:25:16.180
But we're constantly tweaking, trying to make it still a really native feel for whatever target platforming, including Python, so that you can use all your customary tools, have a similar experience in your IDE, and now be able to have a way also that whatever agent you're building with, that they understand the structure and the semantics as well.

01:25:16.740 --> 01:25:18.480
One more question before I let you go.

01:25:18.740 --> 01:25:21.300
Oh, I imagine there's also a lot of Docker in there, right?

01:25:21.880 --> 01:25:22.560
Yeah, absolutely.

01:25:22.660 --> 01:25:26.140
So that was part of our stack as well.

01:25:26.680 --> 01:25:37.920
One of the main reasons we introduced Docker was because a lot of enterprises, when setting up a tool like this, they'll test it on your cloud instance and be like, oh, yeah, that's great.

01:25:38.160 --> 01:25:39.520
But can we put this in our private cloud?

01:25:40.660 --> 01:25:41.660
Can we make it air-gapped?

01:25:41.880 --> 01:25:47.200
I mean, I'm hearing a lot of stories about air-gapped AI solutions and whether they actually have a future or not.

01:25:47.900 --> 01:25:55.060
But either way, we implemented around Docker so that it's an easy pull and set up to be able to run it.

01:25:55.220 --> 01:26:01.780
I do think that there's, it maybe won't be the most common way, but I think there's probably some juice in the air-gapped AI.

01:26:02.140 --> 01:26:05.040
Because with the air-gapped AI, you're going to need your own local models.

01:26:05.440 --> 01:26:17.480
But, you know, for example, a PyCon and an NVIDIA plus Anaconda combo, they had their little AI cubes, you know, their sparks doing a really cool live AI demo.

01:26:17.680 --> 01:26:21.020
And if you were a big organization, you needed, you really needed privacy.

01:26:21.020 --> 01:26:27.260
I could see buying a 10 GPU cluster and just setting that up and make it go locally.

01:26:27.740 --> 01:26:34.320
Yeah, it was interesting how many devs we spoke to who are working in highly sensitive environments.

01:26:34.720 --> 01:26:43.260
There was even one developer who works with the voice and data control recorders for airplanes.

01:26:44.660 --> 01:26:49.240
Obviously, situations like that, they very hesitantly introduce AI.

01:26:49.330 --> 01:26:53.580
And if they do, it has to absolutely be very air gapped and sandboxed.

01:26:54.100 --> 01:27:04.360
So, yeah, like you said, there's some applications where that is still a requirement, even though for most of us who have been on the cloud for however long feel it's a bygone era, but it really is not.

01:27:04.420 --> 01:27:21.000
Yeah. And if I do, I'm not a believer of, oh, the AI bubble is going to pop any day now. But I do think if the pricing changes, all of a sudden, maybe buying a $5,000 machine is the economical choice in the long term. So in which case, that also comes back to that.

01:27:21.060 --> 01:27:45.920
Yeah, yeah. And that's an interesting concept too, because obviously what we're paying today, even though we may bulk at it, it is heavily subsidized. We all know that. So either the subsidies run out and hopefully compute has a lot cheaper so that we can keep running or, you know, we have to make some tough choices about what we want to invest in and what projects are worth it. Or like you say, investing in our own hardware to run our own local LLMs.

01:27:46.040 --> 01:28:00.740
Yeah, we don't have time to go super down this, but I do think that this extreme load on compute and kind of the subsidizing as well is a forcing function for creating much more efficient compute and forcing the models to execute more efficiently.

01:28:01.200 --> 01:28:08.680
And I can certainly see a way where we just innovate our way through to where the actual price falls back to close to what we're paying.

01:28:09.260 --> 01:28:17.080
As a data point, the latest NVIDIA H200, I don't know what it's called, H200 or whatever, is 10 times more efficient at difference than the one before.

01:28:17.720 --> 01:28:18.820
By what, right?

01:28:20.060 --> 01:28:22.660
So you do that a few times, all of a sudden, there's not a bubble.

01:28:23.100 --> 01:28:23.660
It's back to normal.

01:28:24.240 --> 01:28:24.540
Absolutely.

01:28:24.880 --> 01:28:27.640
I mean, we've seen it before in many iterations, right?

01:28:27.840 --> 01:28:29.940
Like the need facilitates innovation.

01:28:30.200 --> 01:28:31.820
And that's probably where we're going to be now.

01:28:31.920 --> 01:28:40.860
And we're facing, I mean, the concept of world models and other stuff happening to quantum computing, which I don't know what everybody says, five years, 10 years, whoever.

01:28:42.140 --> 01:28:44.260
But I mean, all that is going to change the game.

01:28:44.500 --> 01:28:46.280
So we'll see how it all comes together.

01:28:46.660 --> 01:28:47.780
Beyond, thanks for sharing your thoughts.

01:28:48.280 --> 01:28:49.280
Congrats on Capitio.

01:28:49.840 --> 01:28:50.140
Thank you.

01:28:50.480 --> 01:28:51.020
Appreciate that, Michael.

01:28:51.400 --> 01:28:52.160
Yeah, thank you so much.

01:28:52.280 --> 01:28:52.560
Bye-bye.

01:28:52.860 --> 01:28:53.160
Take care.

01:28:54.440 --> 01:28:57.340
Our final startup is Pixel Table, started by Marcel.

01:28:58.960 --> 01:29:00.360
Marcel, welcome to Talk Python To Me.

01:29:00.780 --> 01:29:01.240
Nice to see you.

01:29:01.420 --> 01:29:02.780
Michael, thank you for having me.

01:29:03.220 --> 01:29:04.640
Great to have you on the show.

01:29:05.140 --> 01:29:09.760
Very cool that you all were part of Startup Row, and I'm excited to hear about Pixel Table,

01:29:10.160 --> 01:29:12.940
your new company that you're getting going, which is exciting.

01:29:13.440 --> 01:29:17.020
Before we dive into all that, though, you've got quite a history in the Python space.

01:29:17.360 --> 01:29:19.680
Tell people who you are and what you've been up to.

01:29:20.000 --> 01:29:21.180
Yeah, happy to.

01:29:21.660 --> 01:29:24.260
So my background is really in database internals.

01:29:24.400 --> 01:29:26.700
I did that at grad school a long time ago.

01:29:27.980 --> 01:29:31.780
I worked at a bunch of database startups in the early 2000s.

01:29:31.780 --> 01:29:37.040
I was at Google from '03 to '10, also working on scalable data infrastructure.

01:29:38.060 --> 01:29:45.120
And toward the tail end again on a new internal database system, what we called hybrid transactional

01:29:45.420 --> 01:29:47.580
analytic processing called F1.

01:29:47.920 --> 01:29:54.080
And after leaving Google, I joined Cloudera and started a project there called Apache Impala,

01:29:55.000 --> 01:29:58.180
or later it became an Apache project, a scale-out SQL engine.

01:29:58.800 --> 01:30:03.600
And as part of that, I also co-created the Parquet file format

01:30:04.090 --> 01:30:07.320
because there was no good open source columnar format at the time.

01:30:07.600 --> 01:30:11.840
So this was basically the motivation for creating Parquet

01:30:12.510 --> 01:30:16.900
as basically an open source implementation of Column.io from Google's Dremel.

01:30:17.600 --> 01:30:19.840
And so, yeah, so that's really my background.

01:30:19.880 --> 01:30:30.680
And I got interested in the, I want to say the ML space and computer vision by coincidence when I was an EIR at a venture firm and met a computer vision person there.

01:30:30.770 --> 01:30:32.540
So this was early 22.

01:30:33.360 --> 01:30:39.840
And I ended up then talking to a whole bunch of computer vision engineers and managers of engineering teams.

01:30:40.600 --> 01:30:42.660
And they're obviously all used Python.

01:30:42.970 --> 01:30:45.060
And all of that happens in the Python ecosystem.

01:30:45.720 --> 01:30:48.780
And that was kind of the motivation for creating Pixel Table.

01:30:49.280 --> 01:30:58.880
back then as a, I want to say, a unified view of data and storage and also the transformations

01:30:59.880 --> 01:31:05.280
that you need when you're doing computer vision work, in particular model data set curation,

01:31:06.260 --> 01:31:13.760
training, and so forth. So that's kind of the origin story of Pixel Table. And I'm happy to

01:31:13.970 --> 01:31:17.460
talk about what it is and how it has evolved since then.

01:31:17.820 --> 01:31:21.540
Yeah, that's very cool about all the database work that you've done in Parquet.

01:31:21.730 --> 01:31:24.800
And it's really clear how that's led you to Pixel Table.

01:31:25.360 --> 01:31:34.280
Yeah, it's I think, you know, people are still saving a bunch of CSVs and having huge disk usage because of all that and slow parsing.

01:31:34.330 --> 01:31:35.640
And they should look at Parquet, right?

01:31:36.040 --> 01:31:44.760
Yeah, I mean, Parquet has, you know, obviously since then become a real industry standard and is also the core of, you know, other industry standards such as Iceberg, etc.

01:31:45.080 --> 01:31:49.800
So it's gratifying to see that that had an industry impact.

01:31:50.040 --> 01:31:51.040
Yeah, I'm sure that it was.

01:31:51.400 --> 01:31:51.620
All right.

01:31:51.850 --> 01:31:57.600
So you talked about Pixel Table sort of being inspired by both database work and talking to all these vision folks.

01:31:58.080 --> 01:31:58.880
What exactly is it?

01:31:59.020 --> 01:32:01.020
It's like a database for images?

01:32:01.560 --> 01:32:02.600
Well, it's not.

01:32:02.800 --> 01:32:03.960
The name is a little misleading.

01:32:04.960 --> 01:32:08.460
It is, at its core, it's an OLTP database system.

01:32:08.680 --> 01:32:12.380
So think Postgres, basically something that you can use to power a web app.

01:32:12.390 --> 01:32:14.600
You can do single row inserts and so forth.

01:32:15.020 --> 01:32:15.760
It is multi-user.

01:32:16.200 --> 01:32:17.120
It is transactional.

01:32:17.940 --> 01:32:25.660
But now it's specifically meant for multimodal AI or multimodal applications and AI applications in particular.

01:32:26.080 --> 01:32:30.600
And so it has additional column types that represent multimodal data.

01:32:30.680 --> 01:32:36.080
So you have column types, document, video, audio, image, and array.

01:32:36.660 --> 01:32:37.220
Oh, that's cool.

01:32:37.520 --> 01:32:41.660
Basically, you can now create a table and put videos in there.

01:32:42.140 --> 01:32:44.860
And you would put the videos in there as URLs.

01:32:45.620 --> 01:32:52.140
And then Pixel Table would know when you need to do something with a video to actually transparently download it and so forth.

01:32:52.180 --> 01:32:53.180
So that's one thing.

01:32:54.220 --> 01:33:00.560
And then another specific aspect is that you can now also have computed columns in your table.

01:33:00.980 --> 01:33:09.220
And so in the AI world, when you're working with multimodal data, a lot of the work is really transformations and kind of data plumbing.

01:33:09.860 --> 01:33:13.700
And so this is kind of what you now can express inside the data model.

01:33:14.340 --> 01:33:23.240
And the pixel table runtime will then basically, you can basically express a complex workflow as a number of computed columns.

01:33:23.440 --> 01:33:25.080
It's basically a graph, a computational graph.

01:33:25.740 --> 01:33:28.380
And it could be things like, let's say, take a video.

01:33:28.520 --> 01:33:29.400
You have a table with videos.

01:33:29.960 --> 01:33:31.280
You want to get transcripts.

01:33:32.160 --> 01:33:33.420
First, you need to extract the audio.

01:33:33.560 --> 01:33:37.960
So the audio extraction would be a computed column with the output type audio.

01:33:38.580 --> 01:33:45.100
And it uses a UDF called Extract Audio, which uses FFmpeg or libAV.

01:33:45.430 --> 01:33:50.620
So we're using standard Python ecosystem functionality for processing this data.

01:33:51.360 --> 01:33:56.120
But you can now string it together without having to think about all the data plumbing.

01:33:56.520 --> 01:33:58.260
And the whole thing is still transactional.

01:33:58.410 --> 01:34:00.600
So you extract the audio as a computed column.

01:34:01.260 --> 01:34:06.900
And then you could invoke a transcription model to get the transcript out as an example, which would be another computed column.

01:34:07.240 --> 01:34:09.980
So you can build up these very complex graphs.

01:34:10.260 --> 01:34:16.500
And then you must have some kind of backend that holds the audio and holds the transcript and then links to it or kind of like you talked about in the video.

01:34:16.600 --> 01:34:21.940
So what we do is all basically media data is external and file based.

01:34:22.120 --> 01:34:27.500
So if you show up with, you know, let's say a petabyte of videos, we're not expecting you to upload that.

01:34:27.540 --> 01:34:28.640
That would be extremely inefficient.

01:34:29.260 --> 01:34:30.580
So we're simply referencing it.

01:34:31.620 --> 01:34:32.960
The same is true for audio files.

01:34:33.180 --> 01:34:34.500
The same is true for computed columns.

01:34:34.540 --> 01:34:43.020
You can actually even put a destination attribute on a computed column and tell it to put the media data into a bucket, as an example.

01:34:43.500 --> 01:34:54.360
But then we put the structured data into Postgres, and we also use PG vector, but we have our own transaction system and our own type system on top of it.

01:34:54.640 --> 01:35:04.360
And so when you do an insert into a pixel table table, it figures out the complete plan, like what goes into Postgres, what needs to happen in Python directly.

01:35:04.860 --> 01:35:16.160
We have a runtime system and an execution system that is now able to take this computational graph and optimize it and do parallelization and asynchronous execution and stuff like that.

01:35:16.320 --> 01:35:39.620
This is incredibly interesting. The more you're telling me about it, I think this is a really clever idea. The way it kind of turns the database into this workflow engine that just hides all the messiness of, oh, I just need the audio of this thing. So we got the audio column based on, you know, like computer column. And that's, I can see that just saving so much work, so much queue, asynchronous programming and all kinds of things.

01:35:40.060 --> 01:36:00.180
Yeah, exactly. And that's really the motivation and the application area, which is basically multimodal data processing, right? Including very complex systems that are fairly easy to now model as basically a sequence of tables and views. So, you know, for a podcaster like you, this might actually be very advantageous.

01:36:00.320 --> 01:36:17.240
Yeah, absolutely. I do transcripts and get the audio from videos and all sorts of stuff all the time. It certainly connects with me. So two things I want to talk about on your offering here, kind of the business model and just some features before we move on to startup row. One, let's go with a smaller one first.

01:36:17.360 --> 01:36:25.280
I see that you have skills for working with Pixel Table and that you can install the skills with npm or other ways.

01:36:26.020 --> 01:36:29.460
You also have startup with uv, like a startup template type thing.

01:36:30.300 --> 01:36:41.660
I think there's some really interesting trends for people, including skills and other AI enablers or accelerators in their documentation or in their projects.

01:36:42.100 --> 01:36:43.140
That's really neat.

01:36:43.320 --> 01:36:47.940
the fact that you can just get the skill so your agent can just jump right in. What's your thinking

01:36:48.100 --> 01:36:53.040
there? Yeah, exactly. I mean, this is sort of the way people are writing applications today,

01:36:53.760 --> 01:36:59.840
right? You kind of expect to use AI to generate most of the code. And so, you know, Pixel Table

01:36:59.870 --> 01:37:05.640
comes with a skill. And we actually think that Pixel Table is very agent-friendly and very AI

01:37:05.900 --> 01:37:12.039
coding-friendly because it gives you a semantic model that basically gives you type safety and

01:37:12.060 --> 01:37:19.080
also type safety of your data at rest. So it gives you a lot of guardrails and it allows you to

01:37:19.380 --> 01:37:25.460
express these complex workflows with relatively little code. So there is less room for the AI

01:37:26.070 --> 01:37:30.340
to drive the thing off a cliff, right? You're not going to, even with a very complex pipeline or a

01:37:30.340 --> 01:37:36.480
very complex workflow, it's typically no more than a few hundred lines of code because all of the

01:37:36.500 --> 01:37:39.680
data plumbers abstracted through the data model.

01:37:39.960 --> 01:37:42.040
And so you don't end up, you end up with something

01:37:42.540 --> 01:37:43.580
that is actually maintainable

01:37:44.540 --> 01:37:47.660
and where the AI has a far higher success rate

01:37:47.840 --> 01:37:50.220
of putting something together that actually works.

01:37:50.620 --> 01:37:53.760
Then if you have to wire it all up from a bunch of components

01:37:54.060 --> 01:37:55.880
and you end up with like 10,000 lines of code

01:37:56.300 --> 01:37:58.300
that if you go back to it a month later

01:37:58.860 --> 01:37:59.780
and try to change something,

01:38:00.280 --> 01:38:02.460
it's gonna quickly get out of hand, et cetera.

01:38:02.720 --> 01:38:04.559
So this is really, we really see this

01:38:04.580 --> 01:38:09.160
as enabling technology for creating these applications

01:38:09.640 --> 01:38:13.500
quickly and efficiently and also safely with AI.

01:38:13.880 --> 01:38:15.180
I think it's a great idea.

01:38:15.420 --> 01:38:18.920
And so many people talk about AI hallucinations

01:38:19.300 --> 01:38:21.540
and AI just creating a bunch of slop and junk.

01:38:21.620 --> 01:38:23.740
And I feel a lot of that is because it's not

01:38:24.180 --> 01:38:25.460
guided and constrained.

01:38:25.460 --> 01:38:26.620
You talked about the guardrails.

01:38:26.820 --> 01:38:28.780
And instead of just saying, well, it's like Postgres,

01:38:29.080 --> 01:38:30.000
just so make me a database.

01:38:30.260 --> 01:38:30.640
You know what I mean?

01:38:30.740 --> 01:38:32.440
And it doesn't know about all these really cool features.

01:38:32.960 --> 01:38:35.880
the skill comes on, it's like, oh, yeah, you need transcripts, you need audio.

01:38:36.380 --> 01:38:39.240
It really can get a much better outcome.

01:38:39.400 --> 01:38:45.240
Okay, so the other business thing before we jump into Startup Row is I see two things in your nav.

01:38:45.620 --> 01:38:47.580
I see open source and I see pricing.

01:38:48.040 --> 01:38:50.360
What's the business model and what's open source and what's pricing?

01:38:50.680 --> 01:38:51.000
Yeah, yeah.

01:38:51.060 --> 01:38:51.620
How does this work?

01:38:51.980 --> 01:38:56.680
So Pixel Table is available as a locally pip installable package, and that is fully open source.

01:38:56.780 --> 01:38:59.260
You can just, like I said, pip install it, run it locally.

01:38:59.860 --> 01:39:04.860
And we are working on a cloud service where-

01:39:04.940 --> 01:39:07.180
so like I said, Pixel Table is a database at its core.

01:39:07.600 --> 01:39:09.680
When you install it locally, all the tables are local.

01:39:10.740 --> 01:39:13.760
There's also a piece of serving infrastructure.

01:39:14.080 --> 01:39:16.200
So you can very quickly, from a table definition,

01:39:16.480 --> 01:39:19.540
actually come up, bring up a REST endpoint,

01:39:20.260 --> 01:39:23.440
and basically serve the logic and create basically CRUD

01:39:23.560 --> 01:39:24.800
applications with it.

01:39:25.360 --> 01:39:26.660
But that's all on your local machine.

01:39:27.160 --> 01:39:28.380
Or if you want to run it in the cloud,

01:39:28.560 --> 01:39:29.380
You have to host it yourself.

01:39:30.120 --> 01:39:42.360
And we're soon going to be able to offer a basically cloud hosted tables, basically a cloud service that allow you to do all of that in the cloud, kind of like you think of an RDS or, you know, a snowflake or something like that.

01:39:42.730 --> 01:39:45.520
But now for multimodal AI applications.

01:39:46.470 --> 01:39:47.440
So that's amazing.

01:39:47.840 --> 01:39:48.460
Yeah, exactly.

01:39:48.840 --> 01:39:51.280
I think that's a really good solid model.

01:39:51.530 --> 01:39:57.680
You know, like a lot of people use these tools, but then they're just not DevOps folks or they don't want to run servers.

01:39:58.180 --> 01:40:00.440
You know, they just like, you guys just handle that for us, right?

01:40:00.520 --> 01:40:04.540
And that's a perfect synergy without misaligned incentives and stuff.

01:40:05.240 --> 01:40:06.500
Let's talk Startup Row.

01:40:06.920 --> 01:40:08.580
Why do you guys, why do you apply to it?

01:40:08.880 --> 01:40:09.880
Why do you go to this?

01:40:10.880 --> 01:40:13.520
Yeah, obviously, you know, PyCon, a very large conference,

01:40:14.440 --> 01:40:18.600
draws a, you know, a technical and very interested audience.

01:40:19.340 --> 01:40:22.560
And so, and we're obviously part of the Python ecosystem, right?

01:40:22.610 --> 01:40:25.380
It was sort of Pixel Table is fully in Python.

01:40:26.040 --> 01:40:32.720
And so this was a great opportunity for us to basically, you know, meet a bunch of folks.

01:40:33.280 --> 01:40:39.100
And we had a very large number of interesting conversations where people basically came by and said, hey, what is Pixel Table?

01:40:39.200 --> 01:40:43.520
And then very often the response was, oh, this is really interesting.

01:40:44.060 --> 01:40:50.240
I know either I am working on something related or I know a colleague of mine who was just trying to solve a similar problem, etc.

01:40:50.480 --> 01:40:54.560
So there were a lot of really interesting conversations that started that way.

01:40:54.820 --> 01:40:55.620
Yeah, that's great.

01:40:56.020 --> 01:40:59.340
I, you always hear that people say, oh, you should talk to customers as you're getting

01:40:59.410 --> 01:41:02.740
your company up and running and people who are using your product and so on.

01:41:02.880 --> 01:41:04.360
And it's one thing to put up a website.

01:41:04.680 --> 01:41:08.020
It's another to get people engaged enough to spend some time talking with you.

01:41:08.030 --> 01:41:11.540
And especially having that first experience, you know, people who look at your site and

01:41:11.680 --> 01:41:12.620
don't make sense of it, just leave.

01:41:12.730 --> 01:41:14.340
They don't take the time to talk to you.

01:41:14.580 --> 01:41:18.860
But at the booth, people come by and they, they maybe have no idea and you can get these

01:41:19.020 --> 01:41:19.500
first impressions.

01:41:19.830 --> 01:41:23.520
And so did you learn some interesting stuff talking to people at the show?

01:41:24.140 --> 01:41:32.420
Yeah, I mean, there's actually a large number of people who are building applications like this and sort of struggling to put it together.

01:41:32.660 --> 01:41:37.100
So there's a fair amount of interest in multimodal AI.

01:41:37.540 --> 01:41:43.360
And then also, as I mentioned, everybody's using AI for coding today.

01:41:43.800 --> 01:41:49.640
So being AI-friendly, coding agent-friendly is also very important.

01:41:50.000 --> 01:41:50.780
Yeah, of course.

01:41:51.220 --> 01:41:52.560
So how'd StartupRow go?

01:41:52.900 --> 01:41:53.920
You happy you went there?

01:41:54.220 --> 01:41:59.720
it's worth your time and yeah yeah absolutely absolutely we had a good uh two days i was there

01:41:59.880 --> 01:42:05.720
for two days and so yeah we had a lot of uh good conversations and not all of them i've had the

01:42:05.880 --> 01:42:11.120
chance to follow up on yet but uh we will we will do that as well so yeah we're we're hoping we're

01:42:11.120 --> 01:42:18.540
hoping it'll um it'll it'll help our business yeah i have a bunch of partnership follow-ups and other

01:42:18.880 --> 01:42:23.920
things i want to reach out to people i met at pycon a couple weeks ago and i'm still just digging

01:42:23.940 --> 01:42:28.720
backlog of email and work that I got from being away for a week. So it takes some time.

01:42:29.010 --> 01:42:29.340
It does.

01:42:29.660 --> 01:42:36.560
It does. So tell us about the tech behind this. You mentioned Postgres already. So I guess it's

01:42:36.670 --> 01:42:41.420
built kind of on top of Postgres, but tell us about some of the tech that makes Pixel Table go.

01:42:41.980 --> 01:42:47.060
Yeah, exactly. So Postgres is a component of the underlying stack. Like I said, we use Postgres

01:42:47.130 --> 01:42:53.540
for structured storage and for transactional updates to structured storage or structured data.

01:42:54.080 --> 01:42:59.620
And then obviously, because we're dealing with a lot of media data, we also need to maintain files.

01:43:00.900 --> 01:43:09.160
There is an execution engine, which basically given a query or an update, like an insert, insert, update, delete, creates a plan, an execution plan.

01:43:09.200 --> 01:43:12.040
So it looks very much like a database system on the inside.

01:43:12.620 --> 01:43:16.440
So there is a catalog that records the metadata persistently.

01:43:16.900 --> 01:43:28.140
We also put that into Postgres and then an execution system that creates a plan for any, like I said, query update statement and then runs through the plan.

01:43:28.370 --> 01:43:33.920
And part of it is, like I said, our own asynchronous execution engine.

01:43:34.370 --> 01:43:43.860
And then we have a whole bunch of integrations with external API providers like Anthropic, OpenAI, and then also integrations with things like the pill package.

01:43:44.480 --> 01:43:57.980
So, like I said, image is a column type and you can now run all the pill image transformations on your image data simply via basically putting that into a query or a computed column.

01:43:58.180 --> 01:44:02.680
Right. So you don't have to. And again, the output then is stored back in the right place.

01:44:02.920 --> 01:44:07.840
So you don't have to think about intermediate data and where it all lands or how you find it again and so forth.

01:44:08.000 --> 01:44:14.960
So we're really tying together an execution system with the storage system and doing it all transactionally.

01:44:15.100 --> 01:44:22.000
So it's a full multi-user database and with transactional, you know, isolation, atomicity, semantics and so forth.

01:44:22.480 --> 01:44:27.000
Sounds awesome. So where's things going? How long has this been around to start, I guess?

01:44:27.400 --> 01:44:28.780
When did you make it public?

01:44:29.010 --> 01:44:31.840
We incorporated in April of 24.

01:44:32.270 --> 01:44:32.400
Yeah.

01:44:32.730 --> 01:44:34.280
So a little over two years.

01:44:34.820 --> 01:44:41.540
And we're about to launch the, like I said, service for these cloud hosted tables.

01:44:41.650 --> 01:44:43.600
So basically taking a local pixel table.

01:44:44.090 --> 01:44:48.560
And then we're also right from the very beginning, it's been very important for us to give you

01:44:48.820 --> 01:44:49.700
basically a hybrid experience.

01:44:50.150 --> 01:44:54.180
And so it was always the plan that the local SDK would be there.

01:44:54.900 --> 01:44:57.240
and there would be a cloud service to complement it.

01:44:57.580 --> 01:45:00.820
It was never the idea that there would only be a cloud service, right?

01:45:01.060 --> 01:45:04.380
So a lot of, especially data scientists like to work locally,

01:45:04.900 --> 01:45:08.600
but we also see that as an advantage now with agentic coding

01:45:09.140 --> 01:45:11.760
that agents AI likes to iterate quickly

01:45:12.300 --> 01:45:14.860
and doing that locally is quick by definition, right?

01:45:14.940 --> 01:45:16.580
You avoid server round trips and all that stuff.

01:45:16.820 --> 01:45:22.260
So we're really happy that that's how the setup works.

01:45:22.420 --> 01:45:31.300
So, but yeah, so the next step, like I said, in the next few months, we'll have the cloud service up and running.

01:45:31.500 --> 01:45:31.960
Oh, excellent.

01:45:32.250 --> 01:45:40.960
If somebody is using Postgres today and they think, oh, some of these extra features, like a document column type or image column type or whatever, sounds really great.

01:45:41.500 --> 01:45:46.840
What's the process from going from like a regular Postgres setup to yours?

01:45:47.040 --> 01:45:53.480
Like, could we use SQLAlchemy to talk to Pixel Table, or do we need a special driver to speak to it?

01:45:53.680 --> 01:45:56.180
Yeah, so Pixel Table does not speak SQL.

01:45:56.620 --> 01:46:00.700
So, and Pixel Table is also not a, it's a separate database system.

01:46:00.940 --> 01:46:06.180
Really, we use Postgres under the covers, but it's not a Postgres layer or anything like that or a plugin.

01:46:06.740 --> 01:46:09.880
So you would need to ingest your data from Postgres into Pixel Table.

01:46:09.980 --> 01:46:16.680
Right. Kind of a whole two data models in memory at once for a moment and do a migration and then

01:46:16.800 --> 01:46:20.420
then just swap or something like that. Yeah, exactly. And then, like I said,

01:46:20.560 --> 01:46:26.780
it's not a, we don't have SQL support. It's not meant for analytic applications really. And so

01:46:27.140 --> 01:46:33.060
you would be using the pixel table SDK for, you know, to both express the table structure and then

01:46:33.220 --> 01:46:39.020
also create your, like I said, there is a very simple way of creating services given table

01:46:39.040 --> 01:46:44.560
definitions. Yeah, excellent. Okay, so let's close out this segment by having you just speak to people

01:46:44.590 --> 01:46:49.400
who this sounds interesting to. What should they do to get started? Yeah, I mean, my advice is

01:46:51.040 --> 01:46:56.700
look in the docs, go to the GitHub page, look through the readme, have install it. We have a,

01:46:56.980 --> 01:47:03.220
you know, a quick start guide, and then there's a whole bunch of tutorials. And one of them is

01:47:03.240 --> 01:47:09.020
probably going to reflect something that you're interested in, such as, let's say, creating an

01:47:09.580 --> 01:47:14.680
index of audio transcripts of your videos, as an example, right? That's something you can actually

01:47:14.920 --> 01:47:20.760
do in probably half an hour. And then play around with it. Okay, excellent. Marcel, thank you for

01:47:20.790 --> 01:47:25.000
being on the show. And Pixel Table looks like a really cool product. Congratulations. Michael,

01:47:25.320 --> 01:47:30.620
thank you for having me again. You bet. Bye-bye. This has been another episode of Talk Python to

01:47:30.620 --> 01:47:31.720
Thank you to our sponsors.

01:47:31.930 --> 01:47:33.220
Be sure to check out what they're offering.

01:47:33.410 --> 01:47:34.800
It really helps support the show.

01:47:35.360 --> 01:47:38.280
What if your AI agents worked like FastAPI microservices,

01:47:38.940 --> 01:47:41.220
typed, autonomous, and discovering each other at runtime?

01:47:41.920 --> 01:47:43.580
That's the world Agent Field is building.

01:47:44.200 --> 01:47:47.100
Join them at talkpython.fm/agentfield.

01:47:47.560 --> 01:47:49.440
If you or your team needs to learn Python,

01:47:49.650 --> 01:47:53.060
we have over 270 hours of beginner and advanced courses

01:47:53.250 --> 01:47:56.800
on topics ranging from complete beginners to async code,

01:47:56.940 --> 01:47:59.720
Flask, Django, HTMX, and even LLMs.

01:47:59.920 --> 01:48:02.220
Best of all, there's no subscription in sight.

01:48:02.880 --> 01:48:04.540
Browse the catalog at talkpython.fm.

01:48:05.280 --> 01:48:08.600
And if you're not already subscribed to the show on your favorite podcast player,

01:48:09.260 --> 01:48:09.900
what are you waiting for?

01:48:10.580 --> 01:48:12.340
Just search for Python in your podcast player.

01:48:12.450 --> 01:48:13.320
We should be right at the top.

01:48:13.740 --> 01:48:16.500
If you enjoyed that geeky rap song, you can download the full track.

01:48:16.730 --> 01:48:18.620
The link is actually in your podcast blur show notes.

01:48:19.420 --> 01:48:20.780
This is your host, Michael Kennedy.

01:48:21.180 --> 01:48:22.240
Thank you so much for listening.

01:48:22.470 --> 01:48:23.240
I really appreciate it.

01:48:23.680 --> 01:48:24.380
I'll see you next time.

01:48:36.260 --> 01:48:39.060
I'm out.