Learn Python with Talk Python's 270 hours of courses

Full-Time Open Source Devs Panel

Episode #448, published Thu, Feb 8, 2024, recorded Mon, Jan 8, 2024

So you've created a Python-based open source project and it's started to take off. You're getting contributors, lots of buzz in the podcast space, and more. But you have that day job working on Java. How do you make the transition from popular hobby project to full time job? After all, you are giving away your open source project for free, right? Well, on this episode, I have put together an amazing panel of guests who all have done exactly this: Turned their project into full time work and even companies in some cases. We have Samuel Colvin, Gina Häußge, Sebastián Ramírez, Charlie Marsh, Will McGugan and Eric Holscher on to share their stories.

Watch this episode on YouTube
Play on YouTube
Watch the live stream version

Episode Deep Dive

Guests and Their Backgrounds

  • Will McGugan
    Created the popular Rich library for beautiful terminal output in Python. He then founded Textualize, which builds on Rich to create Textual, a framework for interactive, TUI-style Python apps.

  • Charlie Marsh
    Author of Ruff, a lightning-fast Python linter and formatter written in Rust. He started working on Ruff as a passion project, and it quickly grew into a full-time endeavor.

  • Samuel Colvin
    Maintainer of Pydantic, a popular data-validation library using Python’s type hints. He later founded a company around Pydantic after it attracted significant VC interest.

  • Gina Häußge
    Creator of OctoPrint, a remote interface for 3D printers built in Python. Gina has been funded mostly by community donations and crowdfunding to keep developing OctoPrint as her full-time job.

  • Eric Holscher
    Co-founder of Read the Docs, a documentation-as-a-service platform used widely across the Python and open-source ecosystems. Eric also started an advertising platform called Ethical Ads to support open-source projects.

  • Sebastián Ramírez
    Author of FastAPI and other Python libraries (e.g., SQLModel, Typer). Currently working on open source with backing from an open-source fellowship, helping him focus full time on FastAPI and related tools.


Key Topics and Takeaways

  1. Transitioning a Hobby Project into Full-Time Work

    • Several panelists turned their side projects (like Ruff, Rich, and OctoPrint) into full-time open-source jobs.
    • Common themes include solving their own pain points, sharing progress early on GitHub, and organically attracting users.
    • “It was never the intention to make it a job—my project just took off,” said Gina of OctoPrint, capturing the accidental nature of many open-source careers.
  2. Open-Source Monetization Strategies

    • Donations and Crowdfunding: Gina relies heavily on community support (Patreon, GitHub Sponsors, etc.).
    • VC Funding: Samuel raised money for Pydantic; Charlie also created a company around Ruff.
    • Services and Hosting: Eric provides paid private hosting on Read the Docs and uses Ethical Ads to sustain open source.
    • Lessons: There is no single path—people combine different approaches based on their audience and project scale.
  3. Choosing the Right Time, Right Place

    • Many projects thrived because they emerged just as Python users needed them most.
    • FastAPI capitalized on type hints and the async/await trend. Rich arrived when devs wanted more polished terminal UI. Ruff quickly rose thanks to speed and Rust-based tooling interest.
    • “I was surprised how fast it escalated once I launched it,” Charlie said about Ruff’s early adoption.
  4. Building Community and Ecosystems

    • Most guests emphasized community input: user feedback, GitHub issues, and early adopters who helped test new features.
    • Having a friendly, open culture for contributors fosters plug-in ecosystems (e.g., Rich plug-ins, OctoPrint plug-ins, Pydantic usage in FastAPI).
    • “That direct feedback loop is crucial,” said Sebastián, noting how user suggestions quickly evolve into new features.
  5. Combining Existing Tools for New Innovations

    • Sebastián’s approach: “I just combined Starlette, Pydantic, and other standards to build FastAPI.”
    • Gina, Will, and others echoed the theme of mashing up proven libraries rather than reinventing from scratch.
    • Big takeaways: Open-source fosters synergy—projects can feed into each other and accelerate progress.
  6. Rust and Python Interplay

    • Charlie wrote Ruff in Rust to provide a faster toolchain for Python developers.
    • This bridging of Rust and Python is increasingly common, as Python devs want performance without giving up Python’s ecosystem.
    • Speed benefits: “I wanted a linter and formatter that ran so fast you could basically run it on every file-save,” Charlie explained.
  7. Puppies vs. Cake: Accepting (or Declining) Pull Requests

    • Will and Gina used the metaphor “Some PRs are like giving you a puppy—you own it forever,” meaning certain contributions add long-term maintenance burdens.
    • The simpler, quick-win PRs are more like “cake,” easy to enjoy without future overhead.
    • This discussion highlighted how maintainers must learn to say “no” to complex features that can overcomplicate a project.
  8. Advice for Aspiring Maintainers

    • Passion First: “Focus on a problem that is important to you,” said Sebastián.
    • Be Prepared for the Long Haul: “If you aren’t excited about it, you won’t stick with it,” Gina cautioned, describing how full-time open source can consume your life.
    • Community Over Code: Engaging with issues, conferences like PyCon, and social media fosters real appreciation and user empathy.

Overall Takeaway

Building a successful open-source project often begins as a personal itch to scratch, but it can flourish into a career if it solves real-world problems and attracts a thriving community. Whether you rely on user donations, paid services, or venture capital, the path requires persistence, passion, and a willingness to learn from contributors and users alike. As the guests’ stories show, Python’s ecosystem is a welcoming place where collaboration and genuine need can spark incredible outcomes—and sometimes take you by surprise.

Will McGugan: @willmcgugan
Charlie Marsh: @charliermarsh@hachyderm
Sebastián Ramírez: @tiangolo
Samuel Colvin: @samuel_colvin
Gina on Mastodon: chaos.social/@foosel
Eric Holscher: @ericholscher

Pydantic: pydantic.dev
Astral (makes of Ruff): astral.sh
Octoprint: octoprint.org
Read the Docs: readthedocs.com
FastAPI: fastapi.tiangolo.com
Textual (makes of Rich): textualize.io
Watch this episode on YouTube: youtube.com
Episode transcripts: talkpython.fm

--- Stay in touch with us ---
Subscribe to Talk Python on YouTube: youtube.com
Talk Python on Bluesky: @talkpython.fm at bsky.app
Talk Python on Mastodon: talkpython
Michael on Bluesky: @mkennedy.codes at bsky.app
Michael on Mastodon: mkennedy

Episode Transcript

Collapse transcript

00:00 So you've created a Python-based open source project, and it's starting to take off.

00:04 You're getting contributors, lots of buzz in the podcast space, and more.

00:08 But you have that day job working on Java still.

00:12 How do you make that transition from popular hobby project to a full-time job?

00:17 After all, you're giving away your open source project for free, right?

00:21 Well, on this episode, I put together an amazing panel of guests who all have done exactly this.

00:27 Turned their project into full-time work and even companies in some cases.

00:31 We have Samuel Colvin, Gina Huska, Sebastian Ramirez, Charlie Marsh, Will McGugan, and Eric Hulsher on to share their stories.

00:40 This is Talk Python to Me, episode 448, recorded December 7th, 2023.

00:46 Welcome to Talk Python to Me, a weekly podcast on Python.

01:03 This is your host, Michael Kennedy.

01:05 Follow me on Mastodon, where I'm @mkennedy, and follow the podcast using @talkpython, both on fosstodon.org.

01:13 Keep up with the show and listen to over seven years of past episodes at talkpython.fm.

01:18 We've started streaming most of our episodes live on YouTube.

01:22 Subscribe to our YouTube channel over at talkpython.fm/youtube to get notified about upcoming shows and be part of that episode.

01:30 This episode is sponsored by BaseDash.

01:33 BaseDash uses AI to build a dashboard for your database.

01:37 Get a custom admin view in your Postgres, Microsoft SQL Server, MySQL, MariaDB, or Redshift database.

01:45 Get started for free at talkpython.fm/BaseDash.

01:49 And it's brought to you by Sentry.

01:51 Don't let those errors go unnoticed.

01:53 Use Sentry.

01:54 Get started at talkpython.fm/sentry.

01:57 Hello, everyone.

01:58 Charlie, Will, Eric, Sebastian, Gina, and Samuel.

02:02 What a big group of people we have here today.

02:04 An awesome, awesome group.

02:05 Thanks for being here, everyone.

02:06 It's going to be super fun to have you on the show.

02:09 You know, I know there's so many people out there that are dreaming of an open source project

02:14 or even working on open source and contributing to it, but it's something they squeeze in the last hour of their day.

02:21 And at some point, all of you have made this amazing transition to where there's enough support, there's enough interest in what you all built that becomes your full-time thing, right?

02:32 Which is, I know for many out there, living the dream.

02:34 So you all are living the dream.

02:36 I'm hopefully you feel that way.

02:39 But it's going to be really great to kind of just explore your projects, how do you make that transition, and, you know, what you're up to.

02:45 So we have Samuel Colvin on from Pydantic, and he has the tightest schedule.

02:52 He's squeezing us in on a far-flung trip, a work trip.

02:56 So let's go to you first, Samuel.

02:58 Just, you know, tell people a bit about who you are and what your project is to get started.

03:03 Yeah, I'm Samuel.

03:03 I maintain Pydantic, which is a data validation library for Python that uses PyTynx.

03:08 So those weird things you've seen after colon and Python that mostly do nothing unless you run mypy or Pyright.

03:15 Pydantic basically enforces them.

03:17 Almost exactly a year ago, I was sort of working on Pydantic full-time back then, but really spending my own money to do so.

03:24 And a big American VC got in touch.

03:26 And fast forward, I raised some money and started a company at the beginning of this year.

03:31 I hired now 10 people.

03:34 And I'm actually, as you mentioned, I'm in Istanbul at the moment with the whole team.

03:37 It turns out if you have a team with Americans, Iranians, and Russians, that Istanbul is one of the few places that you can actually meet efficiently.

03:44 So, yeah, we're having a really fun week in Istanbul, mostly working together, and then going after dinner, which is where we are at the moment.

03:50 I hope that's a good summary.

03:52 Absolutely.

03:53 And what a cool experience that you get to hang out with all these people talking about your project in Istanbul.

03:59 I just had, by the way, I just had...

04:01 I mean, just think that the other thing I would add is that one of the best bits of it has been being able to hire friends of mine from open source, people who had, I think, all but two of the people here have contributed to Pydantic before we started the company, which is how I hired the first, I think, six people.

04:17 And then a few more.

04:23 being able to pay the property.

04:25 Yeah, awesome.

04:26 I see a lot of people shaking their head out there as well.

04:29 Just coincidentally, I recently had Sydney Runkle on Who Works With You, and she's such an inspiration.

04:35 That show is not out yet, but has already been done yet through the weird time shifting of podcasting.

04:41 So it'll be out before this, but it's not out yet.

04:43 So anyway, very, very cool team you got there.

04:46 I guess we'll go around the order of the video.

04:49 Pretty bunch pictures here.

04:51 So Charlie, you're up next.

04:53 Quick, quick bit about you.

04:55 Hey, so I'm Charlie.

04:56 I am the author of Ruff, which is a Python linter code formatter and code transformation tool written in Rust.

05:04 I started working on Ruff about a year ago, maybe like October last year.

05:09 Similar time frame to Samuel, yeah.

05:11 Yeah, and I worked on it full time for a while, similar to Samuel, although probably not for quite as long.

05:17 I was working on it full time without any funding.

05:19 And then similarly, I started a company around Ruff and really around the vision of trying to build high performance Python tools.

05:27 So take some of the things that make Ruff nice to use and popular and well-liked and try to apply those principles to other parts of the Python tool chain.

05:36 Yeah, we're a team of six and we're fully remote.

05:40 So no two of us live in the same place.

05:43 I guess a couple of us live in the same country, but most of us live in different countries.

05:48 And we span basically U.S. central time to, I don't know, we have one person in India and one person in Minneapolis.

05:57 And that kind of stretches like the full time zones of the team.

06:00 That's a good stretch.

06:01 That's a good stretch there.

06:02 Well, absolutely.

06:03 Congratulations on Ruff.

06:04 It is really, really taken off.

06:06 And I know the guy right below you and this squares, Sebastian, I saw him saying nice things about it with FastAPI and so on.

06:15 Yeah, yeah, I know.

06:16 Thanks a lot.

06:17 It's just funny because I think I was saying before I started recording, I think when I came on Talk Python last time, I think that might have been my first time ever on a podcast.

06:25 And it was to talk about Ruff.

06:26 And so I was like, oh, wow, people care about what I'm doing.

06:28 That's super cool.

06:30 And Pydantic and FastAPI were some of the earliest adopters that people had heard of.

06:36 So they were like very early on in the life cycle and helped a lot with, you know, getting people to see Ruff and sort of care about Ruff and know that smart people are using it.

06:47 That's awesome.

06:47 Well, when you visit Talk Python or the course's website or others, it's all Ruff-ified.

06:54 I don't know what the adjective of Ruff is, but it's been Ruff.

06:58 It's whatever you want to say.

06:59 It's amazing.

07:00 It's been Ruff-ed up and it works great.

07:02 It's really amazing.

07:03 That makes the code sound really bad.

07:05 But yeah.

07:06 True.

07:06 Yeah.

07:07 That's maybe not the best.

07:08 It's like saying it's sick.

07:09 Like, oh, that was a sick trick they did.

07:10 It means good.

07:11 Yeah, that code is rough.

07:12 Yeah, that code is rough, man.

07:13 All right.

07:14 Will, is your code rough?

07:15 Who are you?

07:16 It's got some rough edges, certainly.

07:18 Welcome.

07:19 Yeah.

07:19 I'm Will.

07:20 I'm probably best known for a library called Rich.

07:23 And Rich is a library for writing formatted content in Terminal.

07:27 You can write tables and progress bars and syntax highlighted code, all sorts of things.

07:32 And then that became quite popular in the Python world.

07:36 I think there was a need for it.

07:37 And two years ago, I founded Textualize, which is a company which builds on Rich to produce a library called Textual, which allows you to build user interfaces inside Terminal.

07:49 And these are kind of more like web interfaces and less like Cursus applications.

07:54 Yeah, I was just thinking almost like Flexbox.

07:56 You can dock stuff to the side and that's part of a UI.

07:59 But it's pretty amazing what you've built.

08:01 I think it's pushed the Terminal far beyond what many people thought the Terminal should be doing.

08:06 It's been very cool.

08:06 It's been a process of discovery.

08:08 It's kind of strange.

08:09 You've got technology that's been around for decades and are still discovering things they can do, which people haven't tried before.

08:17 So, yeah, it's been a lot of fun.

08:19 And it's been great to work with a small team of developers.

08:22 We've got a small core here in Edinburgh, Scotland, and we've got one developer in Portugal.

08:26 So, yeah, it's been great.

08:28 And I love the reception and I love what people are building with it.

08:32 Yeah.

08:32 It's so many people are interested in using Rich.

08:36 And there's a ton of plugins, right?

08:38 There's like Rich Click and there's pytest Rich and all these things like, well, whatever we're doing, it should also have what you've built, you know?

08:45 Yeah.

08:45 I love to see that.

08:46 I love to see the ecosystem building.

08:48 Our adjective is richified, which is not as good as possible.

08:51 Richified.

08:51 Okay.

08:51 Yeah.

08:52 Yo, that's rich.

08:53 My code is rich.

08:54 Okay.

08:55 Richified.

08:55 Got it.

08:56 I love it.

08:57 We all have adjectives that we've got to put on things.

08:59 Yeah.

09:00 I'm a big fan of you and your team's work, by the way.

09:03 I mean, I'm sure you hear it all the time that you build awesome stuff.

09:06 Cheers.

09:06 I appreciate it.

09:07 Yeah, indeed.

09:07 We all are.

09:08 Eric, welcome.

09:09 You and I are coming in somewhat local here out of Portland, not Istanbul.

09:14 I'm actually out in Bend at the moment.

09:15 So yeah.

09:16 I absolutely love Bend.

09:17 Lots of mountains and whatnot.

09:19 But yeah, so my background in Eric Holscher, folks probably know me from kind of the Read the Docs ecosystem.

09:23 I feel like I've been doing this for a while compared to everyone else here.

09:27 The project actually started in 2010, which is kind of amazing.

09:30 And then we actually started the company around it in 2014.

09:34 So coming up next year, that'll be 10 years.

09:36 And so, yeah, and we're all bootstrapped.

09:38 So we haven't done any venture capital.

09:40 It's all been kind of just built up the open source and then kind of turned it into a company on top of that.

09:45 We kind of have a business model of doing paid for private hosting, you know, companies as well as advertising on open source.

09:51 And we spun out a kind of a separate business called Ethical Ads that we built kind of to basically make, you know, better advertising on the internet, not doing any of the creepy tracking stuff.

10:00 Read the Docs is so critical to the open source space, not just Python, but especially Python.

10:05 Yeah.

10:06 Yeah.

10:06 Yeah.

10:06 I mean, so awesome work on that.

10:08 And then just, you know, good job on the ad stuff as well.

10:11 It's the tendency of the whole ad space is to be super creepy.

10:15 And just like, how much can we resell and how much can we buy to mix in to like create these shadow profiles?

10:21 And it's not a good social trend.

10:23 It's not good for people.

10:24 And it's not really necessary, right?

10:26 Like if I want to, you know, I've sponsored ads on Read the Docs or had run ads on Read the Docs before.

10:31 And we had a Flask course.

10:32 And let's just, you know, run that ad on Flask instead of like, let's see if we can track somebody through Instagram over to Facebook.

10:40 Who knew, right?

10:41 Yeah, exactly.

10:42 We call it, yeah, newspaper advertising.

10:43 And it's sort of been really cool with the advances of ML.

10:46 Like the content targeting has gotten pretty good, right?

10:48 So it's definitely a lot easier technically these days to kind of do that content matching.

10:53 But yeah, I think in terms of the kind of open source, maybe the way that I'm a little different than other folks here is we're actually running something more akin to a service.

10:59 So Read the Docs, all the code is open source, but a lot of the usage is open source projects using our hosted service.

11:04 We do obviously ship a lot of code.

11:06 Probably our Sphinx theme is probably the most kind of well-known actual software that people are running.

11:11 A little bit similar to the folks here, the kind of sidebar on the left.

11:14 And yeah, so I think that's kind of the background is, yeah, we have a little bit of everything.

11:18 But yeah, it's a little more akin to something like a SaaS app, I would say.

11:21 But the code is all open source.

11:22 We do get a contribution in that way as well.

11:24 Yeah, awesome.

11:25 And, you know, it sounds a little similar to what Textualize is working towards as well, hosting.

11:30 I mean, it's more hosting people's apps than hosting people's docs, but not terribly different.

11:35 Paying for services is a classic open source monetization strategy, right?

11:38 Like you have some way to kind of build the monetization on top.

11:41 Yeah, it's like what you build is great, but it's kind of hard for me to run.

11:44 Could you just do that?

11:44 Like, yeah, sure, we can do that.

11:46 Sebastian, always good to see you.

11:47 Welcome back.

11:48 Thank you very much for having me.

11:50 Hello, everyone.

11:50 I'm Sebastian Ramirez or Tiangelo.

11:53 I created this little tool for building web APIs that is called FastAPI.

11:58 And it has been growing quite a bit.

12:00 People have liked it, fortunately.

12:02 And like, yeah, that's it.

12:04 I'm probably the only one that hasn't built a company here, I guess.

12:08 Okay, baby.

12:11 Okay.

12:11 There are two of us.

12:13 Nice.

12:14 I want to hear that.

12:15 Okay, so this year I have been able to work full-time on open source because Sequoia Capital, the VC firm, started this open source fellowship.

12:22 And I am the first fellow, so I am kind of the test trial of the program.

12:27 So I get, you know, just to work full-time on open source.

12:30 And that's how I've been able to just, yeah, release that stuff in FastAPI and the ecosystem, like the other libraries.

12:36 FastAPI, SQL model, type, and a couple of other things.

12:39 But yeah, that's pretty much it.

12:41 Yeah, awesome.

12:42 Well, FastAPI is definitely the poster child for modern Python on the web.

12:48 You know, and Samuel's work, obviously, is central to that as well, right, with Pydantic being such a core element there.

12:55 So very awesome.

12:56 Yeah, and like, I mean, FastAPI is built on top of like great open source tools and their needs.

13:01 So Pydantic does all the data validation, serialization, documentation.

13:04 And on the other side, Starlette does all the web parts.

13:08 Yeah, it's like, and like, you know, like it's a very close, how do you call it?

13:12 Like a close friendship between all the projects.

13:15 Pydantic, Starlet, Ubicorn, FastAPI.

13:17 Like, you know, like we actually know each, by this point, we actually know each other in person.

13:22 Like the current maintainer of Starlette and Ubicorn works for the Pydantic company.

13:27 And he's like the top FastAPI expert right now.

13:31 But, you know, like it's very nice because helps the dynamism of like the speed of building stuff.

13:39 It's great.

13:39 Yeah, I imagine a lot of people don't realize the interconnections between these different projects that are at play here.

13:46 Yeah, it's definitely super fun.

13:48 Absolutely.

13:48 And then it's worth saying we in Pydantic use FastAPI as well as contributing to the libraries that build it.

13:53 We also use FastAPI for the services that we're building.

13:56 So we're like consumers both directly and indirectly of the things that we maintain in open source.

14:00 Awesome.

14:01 Chat point off and splash is awesome.

14:03 It's turtles all the way down, basically.

14:04 Exactly.

14:06 This portion of Talk Python to me is brought to you by BaseDash.

14:09 BaseDash is the custom admin panel for your database that you don't have to build.

14:15 We've all dealt with endless ad hoc requests for data access.

14:19 Your support team wants user records, your non-technical co-founder needs to see charts,

14:24 or your engineering team needs an easy way to share your SQL queries.

14:28 These all sound like relatively simple tasks, but between building an internal tool,

14:33 setting up an analytics product, and then switching back and forth between that and your SQL client,

14:38 you've lost so much time.

14:40 BaseDash gives you that time back.

14:42 With BaseDash, you can instantly generate a visual UI for your database.

14:47 All you have to do is connect your data source.

14:50 It uses AI under the hood to generate the perfect admin panel for your data.

14:54 Voila!

14:55 Now anyone in your company has access to the data they need.

14:59 They're rolling out a ton of new features like the ability to create charts

15:03 using only natural language.

15:04 You're going to get hours back in your day, and I promise you won't want to build an internal tool ever again.

15:11 Check them out by visiting talkpython.fm/BaseDash.

15:15 That's talkpython.fm/BaseDash.

15:18 The link is in your podcast player show notes.

15:21 BaseDash is free for small teams, so give it a try.

15:24 You've got nothing to lose.

15:25 Thank you to BaseDash for supporting the podcast.

15:29 Gina, also awesome to have you back.

15:31 Welcome in.

15:32 Very happy to be back.

15:34 That's really, really great to be here now, I think, for the second time.

15:36 And the third if we call Python Bytes.

15:39 So, yeah, my name is Gina Heuske, and I'm probably, yeah, I don't know if I'm that well-known throughout the Python community,

15:46 but I'm quite well-known in the 3D printing community for having created Octoprint,

15:50 which is the snappy web interface for U3D printer, and the server part of that is all written in Python.

15:56 And I started a project back in 2012 when I got my first 3D printer as your regular pet project on the side after hours vacation, blah, blah, blah.

16:05 In 2014, I got hired by a 3D printing company to work on it full-time, and in 2016, that company ran out of money,

16:13 and I suddenly found myself with a full-fledged, full-grown open-source project

16:17 and no funding whatsoever.

16:20 So I tried this whole crowdfunding stuff with Patreon, and that is pretty much how I've been working ever since.

16:26 So I'm self-employed under German law.

16:30 I'm a freelancer.

16:31 And, yeah, all my income comes from people who just sent me money for working on Octoprint.

16:38 Did you say since 2016?

16:39 Since 2016, yeah.

16:41 Wow, okay, cool.

16:42 So full-time since 2014, and self-employed and crowdfunded since 2016.

16:47 So it's been a while.

16:49 That's awesome.

16:49 I also went full-time on all my stuff here in 2016, although it's technically not open-source.

16:55 It talks a whole lot about open-source stuff.

16:57 So awesome.

16:58 It's been a while.

16:59 Congratulations.

16:59 Thank you.

17:00 I'm still surprised it works, to be honest.

17:02 I'm waiting every day that it stops working.

17:04 And, yeah, actually, this year it came a bit close, and then I put out a blog post basically along the lines of,

17:10 you know, the income is going this, but the usage numbers are going that,

17:13 so something is amiss here and we need to talk.

17:16 And then the community rallied and stuff fixed itself again.

17:20 So that is pretty amazing.

17:21 That's really awesome.

17:22 Congratulations.

17:22 It's easy for people to just go, oh, it's free, and there's some people supporting it,

17:26 and just kind of assume that things are taken care of.

17:30 But, yeah, really good.

17:31 Really good.

17:32 Yeah, you have a ton of supporters on GitHub sponsors as well, right?

17:37 Actually, I've diversified over the years.

17:38 In the beginning, it was only Patreon and PayPal, and then I started adding new payment platforms and options

17:44 because people prefer to be able to use the stuff that they know, and some people don't like Patreon,

17:49 some people don't like and don't know GitHub sponsors and stuff, and so you just give them the options to choose

17:54 whatever they feel comfortable with, and this increases the likelihood that they actually will go through

17:59 with throwing something in your head, so to speak.

18:01 At least that's my feeling.

18:03 I don't know.

18:03 I think that GitHub sponsors has been really positive for open source.

18:07 I think it's made it pretty easy to just check a box.

18:10 They already have your credit card, potentially, and you just want to give a little support

18:13 instead of a one-time PayPal donation here that you forget about after once and all that.

18:19 Before we move on here, there's a funny comment, nice comment out.

18:22 Kanishk says, this group, look at all of you.

18:26 You guys are the Avengers of Python open source, right, which is kind of like the superheroes.

18:30 I love it.

18:31 It's somewhat actually true, it seems.

18:33 Okay.

18:34 So the next thing I want to ask is a little bit of an origin story.

18:37 Just what projects did you try and they didn't really get traction, and then how do you think that your project got traction here?

18:44 And I know, Samuel, you might vanish any minute, so you're next.

18:47 You're up first on this one.

18:48 That's a really interesting.

18:49 I've built a number of things in open source.

18:51 I started something last week.

18:53 I open source on Friday that has got more stars over the last three days or, I guess, week now.

18:59 as the first project I started, ARQ'd, has over, I think, coming up on six years.

19:04 So, I mean, that's front end, and front end gets a lot more traction than like queuing an RPC does.

19:11 But, yeah, I don't know how, obviously there were some things I played with back then

19:16 that never took off.

19:16 But, yeah, it was this, like, I think having the right time, right place for Titans.

19:20 They'd obviously been around in Titans for a long time, but back in 2017 when I started Pydantic,

19:24 their usage was growing really fast.

19:26 And I think there were lots of people like me who found it kind of frustrating

19:29 that they were there and didn't do anything.

19:30 So, yeah, I think being the right time, right place was super valuable for me.

19:34 And, obviously, like, great projects like FastAPI, adopting Pydantic, has made a big difference.

19:40 But I don't know.

19:41 What's weird, if you look at the download chart, it's like there was a protection point

19:44 at the beginning of 2021.

19:46 So then we had, like, 5 million downloads a month.

19:49 And since then, there's been kind of almost exactly linear growth to now 125 million downloads a month.

19:55 So something weird happened in 2021, not after the project started, I don't know.

19:59 But, yeah, I think it was right place, right time.

20:01 And that frustration was the starting point.

20:04 On that note, I'm going to have to rush guys a bit.

20:06 It's great to see everyone.

20:07 And I'm sure I'll meet you all in a conference soon.

20:09 Bye-bye.

20:10 Thanks for dropping in.

20:10 Good to see you.

20:11 Bye-bye.

20:11 All right.

20:12 Charlie, keep going around the circle here just so I don't...

20:15 Yeah, you know, it's interesting because I, like, this is...

20:19 Ruff is really my first time being a maintainer, like, publishing open...

20:25 Like, I've been a consumer of open source, right, for my whole career, but I was never really, I guess,

20:31 a creator or a publisher or a maintainer of open source.

20:33 You know, around the time that I started working on Ruff, I was working on, like, a couple different projects.

20:39 And they all...

20:39 I was kind of trying to figure out what I wanted to do next.

20:41 I'd left my job recently.

20:42 And Ruff was kind of motivated by a lot of the experiences I had at my job,

20:46 where I was, like, maintaining a large Python code base.

20:48 Did you leave your job with the intent of going to work on Ruff?

20:51 Or were you just like, I'm going to leave, and then I'm going to figure something out.

20:54 And you're kind of like, well, what is the process there?

20:57 I left my job with the intent of starting a company, but I did not think it would be Ruff.

21:01 And Ruff was, like, this distracting side project that I was working on while I was, like...

21:06 I was working with a friend, and we were, like, trying to figure out, like,

21:09 the Venn diagram of interests, of, like, what should we...

21:12 What are we willing to work on full-time together?

21:14 What makes sense, given, like, our interests?

21:16 And then, you know, in all my free time, I was like, I just want to work on developer tools.

21:20 And, like, I worked on...

21:21 I built Ruff, or I started building Ruff.

21:24 I worked on, like...

21:25 Yeah, I worked on a lot of different...

21:26 Not a lot, but, like, I did...

21:28 We were working on a couple of different projects.

21:29 I did, like, a sort of CICD thing where you, like, write Docker files and, like, CI files in TypeScript,

21:36 and they, like, transpile down.

21:37 And I was like, oh, I think that has a lot of cool ideas.

21:40 I worked on, like...

21:41 It was pretty early in a lot of the LLM stuff.

21:44 I worked on, like, a code-based-wide refactoring tool where you, like, give it examples of, like, before and after,

21:50 and then it tries to find examples.

21:51 It was, like, a co-pilot for your entire code base.

21:53 Kind of...

21:53 It didn't work that well, like, at scale, but it was, like, a cool idea.

21:56 So I was, like, working on the stuff that was all open source.

21:58 Maybe it could have been a timing thing.

22:00 Like, maybe today that would be all the business.

22:03 Yeah, I mean, it's also, like, an...

22:05 Yeah, it's also an effort thing, I guess.

22:07 Like, I put a lot more into Ruff.

22:09 And it was interesting because I kept viewing Ruff as, like...

22:12 You know, it was probably open source at that point, but I don't think I had launched, like, launched it.

22:16 And I kept viewing it as, like...

22:18 Like I said, like, a little bit of a distraction.

22:19 And my friend was, like...

22:21 You know, I think you should really, like, push to, like, release this because, like, if you think it's, like, interesting,

22:26 then, like, other people will probably think it's interesting.

22:28 And he was the person that really, like, motivated me to actually, like, see it through

22:32 to doing the release.

22:33 And then I did the release and, like, a lot of people were actually interested in it.

22:37 So that kind of gave me, like, the energy to, like, really start working on it full-time

22:41 and just kind of see where it went.

22:43 And it was really, like, projects like Pynantic and, like, Sebastian started, like, commenting on issues and stuff.

22:48 And I was like, wow, like, real serious projects are looking at this, like, crazy tool.

22:52 And let me just see.

22:54 I'm just going to do whatever it takes to make it, like, a feasible choice

22:56 and just started, like, cranking through, like, all the issues and all the things that we were missing.

23:00 It escalated pretty quickly, I think.

23:03 Did it surprise you?

23:04 Oh, yes.

23:04 Yes.

23:05 Absolutely.

23:06 I was convinced that I had faced, like, this problem around tooling as, like, our code base got large in my last company

23:13 and that there was an opportunity to, like, build, like, better, more performant tooling.

23:17 I genuinely wasn't sure, like, how widely that message would resonate with people.

23:21 And so, I don't know, it's like a little bit of luck, right?

23:24 Like, sometimes you work on great projects and then, like, they go nowhere

23:27 and, like, just no one happens to see it.

23:29 And then sometimes you work on a good thing and, like, it does go somewhere.

23:32 And so, there are certain things that are within your control, certain things that aren't.

23:35 I feel like I did a good job of, like, communicating the project and, like, why it was interesting and why it was exciting.

23:40 But I also feel like I got a little bit lucky that it just, like, gravitated towards the right people

23:44 and got attention in the right ways.

23:46 Sure.

23:46 Also, maybe that Black had existed, which is a little ironic because Black kind of solves a real similar problem.

23:52 But, like, people were, okay, we embrace the idea of the thing that Ruff does really well.

23:57 You know, you just convince them to use Ruff in that sense.

23:59 Yeah.

24:00 I mean, we have a little bit, I mean, it gets back to this.

24:02 Like, we have a little bit of, like, a second mover advantage, right?

24:06 Yes, exactly.

24:07 There's a lot of existing tools that people use already and, like, a lot of those practices,

24:11 like, the idea of using a format or the idea of running code mods, like, the idea of using a linter

24:16 and, like, the knowledge of, like, what kinds of rules are valuable and, like, what kinds of analysis we can do.

24:21 Like, all this stuff existed.

24:23 And that was part of the story, really, was I was, like, these tools are great

24:27 and I get a lot of value out of them, but I want them to be, like, easier and faster.

24:31 And so, yeah, there's definitely a strong timing thing.

24:34 I think, like, I think Rust, too, this is maybe, like, a little bit more specific to what we're doing.

24:38 But, like, you know, I think, like, the intersection between Python and Rust has,

24:42 or the, I guess, the interoperability between them and sort of the ecosystem around it has just grown a lot.

24:48 I mean, still, I would say, like, pretty early, but it's, like, matured and grown a lot over the past few years.

24:53 And so even just the fact that, like, at my last company, we started to introduce Rust

24:57 and we started to, like, move some of our core systems into Rust and expose them over PyO3.

25:02 Like, the fact that that existed and the fact that I was, like, exposed to that,

25:05 like, that's all just, like, pure chance.

25:07 Otherwise, I never would have thought to do this.

25:09 Very cool. Well, congrats.

25:10 Well-deserved.

25:11 We're all doing the, all using Ruff, as we said, is excellent.

25:15 Will, Rich is awesome.

25:16 How, why do you think it took off?

25:18 Did you try stuff before?

25:19 What's the story?

25:20 I tried a lot of stuff before, before GitHub.

25:23 You know, coding has always been my hobby.

25:25 You know, I'd do it for work and I'd come home and work on a hobby project.

25:29 And it just seemed natural to want to share it.

25:31 Pre-GitHub, I would just put stuff on my blog and get some feedback from it there.

25:35 I quite enjoyed that.

25:37 And yeah, I have a number of open source projects.

25:39 Pre-Rich had a BB code parsing library.

25:42 I had a chess library.

25:44 I had a web toolkit.

25:46 So yeah, when Rich came along, it was another hobby project, something to keep me entertained.

25:51 Why is this terminal so boring?

25:53 Come on, see what we can do about that.

25:54 You know, I'd always use the terminal and I'd always struggled when you've got a page of white text

25:58 on black background and you're trying to pick out an IP address from somewhere.

26:03 And, you know, I'd always wished, oh, I wish it would just format it and colorize it for me.

26:08 I know this is possible, but it doesn't happen.

26:10 So then, yeah, I just, I started it and it came together quite well.

26:14 When I released it, it was like, boom, the stars just started accumulating.

26:19 Got lots of feedback.

26:20 It was very exciting.

26:21 And I kept building on it.

26:23 It was kind of like issue-driven development.

26:26 So people would just ask for something.

26:27 Oh, that's a good idea.

26:28 And go ahead and implement it.

26:31 And it grew from there and it became really large.

26:34 I did actually, prior to Rich, I had a library called PyFileSystem.

26:38 And this is kind of like a wrapper to file systems.

26:41 So you can have the same interface for your FTP server as a hard drive for a zip file, S3 bucket.

26:47 And that got some use in the community.

26:50 It wasn't enormous.

26:51 But that taught me a lot about building open source, you know, managing feedback issues, et cetera.

26:58 So that was a great experience when I started working on Rich.

27:02 And I was very surprised, actually, how successful it became.

27:05 I remember the first time I realized that this was bigger than just a hobby project

27:10 is when someone told me off for violating Semver, I released a clear, a clear breaking change

27:16 because I thought, nobody's using that yet.

27:18 But they were.

27:19 So the next day I got told off quite appropriately.

27:23 And then I thought, okay, I'll have to take this more seriously.

27:25 If people are using this in their day job, they can't just have someone who's just like throwing new bits of code

27:32 and changing functionality.

27:33 They had to treat it like it was an actual my day job.

27:37 Yeah, well, everyone on the call here probably has a little bit of nervousness about like,

27:42 if I break this, there are a lot of people that depend on this thing.

27:46 And it's so different.

27:47 It just changes so much.

27:48 When you were talking about the issue-driven development thing too, I just remember that phase of Ruff

27:54 where it was like, anyone who cared all about the project, all I wanted to do was make them happy.

27:59 And I was like, oh, wow, that seems like a cool idea.

28:02 Let's definitely do it.

28:03 And I was just like, it was the point in time where I could fix the bug,

28:07 cut a release the same day, and then their thing is fixed.

28:10 And then it's like, okay, great.

28:11 Now we have a relationship.

28:12 Thanks for using my thing.

28:14 I just think like, but that's changed so much.

28:17 Right?

28:18 Because then I went through the same experiences of like, I ship a release with a breaking change

28:22 that I didn't really document.

28:23 A lot of people get upset.

28:24 And then you realize, okay, I actually have some more responsibility now.

28:28 Yeah, these days, it's more like trying to find the balance between saying no to stuff

28:33 that you then have to end up maintaining and not like disappointing people too much

28:38 because you say no or things like that.

28:40 And then trying to keep this whole interaction with people nice, even though you don't want to do stuff

28:47 that they want you to do because you know it's better for the project.

28:53 This portion of Talk Python to me is brought to you by Sentry.

28:56 You know Sentry for the air monitoring service, the one that we use right here at Talk Python.

29:00 But this time, I want to tell you about a new and free workshop.

29:04 Heaming the Kraken, managing a Python monorepo with Sentry.

29:08 Join Salma Alam Nayour, senior developer advocate at Sentry, and David Winterbottom,

29:14 head of engineering at Kraken Technologies, for an inside look into how he and his team develop,

29:20 deploy and maintain a rapidly evolving Python monorepo with over 4 million lines of code

29:26 that powers the Kraken utility platform.

29:28 In this workshop, David will share how his department of 500 developers,

29:32 who deploy around 200 times a day, use Sentry to reduce noise, prioritize issues,

29:38 and maintain code quality without relying on a dedicated Q&A team.

29:42 You'll learn how to find and fix root causes of crashes, ways to prioritize the most urgent crashes and errors,

29:49 and tips to streamline your workflow.

29:50 Join them for free on Tuesday, February 27th, 2024, at 2 a.m. Pacific time.

29:56 Just visit talkpython.fm/sentry-monorepo.

30:01 That link is in your podcast player show notes.

30:03 2 a.m. might be a little early here in the U.S., but go ahead and sign up anyway

30:07 if you're a U.S. listener, because I'm sure they'll email you about a follow-up recording as well.

30:12 Thank you to Sentry for supporting this episode.

30:18 PRs are like cake or puppies.

30:20 If it's a simple bug fix, that's like cake.

30:22 You'd like, thank you.

30:23 I enjoyed that cake.

30:25 Then move on.

30:26 But some PRs are like a puppy.

30:27 It's like terrific.

30:29 You like puppies, but you've got to feed them and clean up after them.

30:32 Why am I standing in the rain with this puppy on like a Friday night?

30:35 How do I get here?

30:36 Collecting the book is poop.

30:38 Yes, exactly.

30:39 Sometimes you say thank you, but I just can't, I just can't look after another puppy right now.

30:43 That's a difficult thing to come to terms when the project gets a bit more mature.

30:46 Because previously, you're accepting all the puppies, but then you have to start saying no,

30:50 no to puppies.

30:51 And Rich definitely got there because it accumulated.

30:54 Do you hate puppies?

30:55 Come on, that's a pretty hard stance.

30:56 I'm kind of a cat person, to be honest with you.

30:59 But yeah, I mean, you have to say no.

31:01 Unacceptable.

31:02 Eventually, yeah.

31:03 I think this is where plugins always kind of like take the center stage, right?

31:07 You're like, just, oh, that sounds like a great idea for you to maintain

31:10 external to my library.

31:11 That was exactly my approach to the whole situation.

31:14 Yep.

31:14 Here's a plugin API.

31:16 Have fun.

31:16 But also the probability of some little change breaking someone's code and like being considered

31:23 a breaking change grows as the project grows in usage.

31:27 And like, you know, like at some point it's like almost any change will end up

31:32 breaking someone in very unexpected ways because they are doing something really,

31:36 really weird.

31:37 But you know, like someone is doing it.

31:39 So like it becomes more and more difficult to know like, is this a breaking change

31:44 or not?

31:45 Like no one should be using this variable here or this parameter, but like,

31:49 you know, there's someone out there doing that.

31:51 So I feel defining what is actually a breaking change and what is, what is this trick

31:56 somewhere gets more difficult as things grow.

32:00 Yeah, I don't know.

32:01 One of the things I like that the Django project did was kind of basically

32:04 only things that are documented are supported.

32:06 Basically, that was kind of the line they drew and I thought that was a pretty good,

32:09 pretty good way to draw it.

32:10 But yeah, you're always, you know, that never actually works.

32:12 That doesn't make people happy.

32:13 It just gives you plausible deniability.

32:15 Don't yell at me.

32:17 It's not my fault.

32:18 I think adding a formal like versioning policy is one of the best things that we did

32:23 because for a long time rough was just we only used patch releases.

32:26 So we got to like zero, zero, like 285 or something.

32:30 And we had basically no guarantees about what would or wouldn't change like across releases.

32:35 And as the project got more and more popular, like that started to cause more and more problems.

32:40 And so Zany, someone on our team, like when they joined, one of the first few things

32:43 they did was like create an actual formal versioning policy and we added like

32:47 preview behavior.

32:48 So like you can opt similar to what block has kind of opt in to like breaking

32:52 or more experimental changes.

32:54 and so now we have like clear expectations around what it means to like bump a minor release,

32:58 et cetera, et cetera.

32:58 And like that has made our lives a lot easier, like actually having clear expectations

33:03 around that that are communicated and respected.

33:05 But it's the kind of thing that you just don't think about at all until at least I didn't.

33:08 Until I checked on figure.

33:10 Yeah.

33:11 Some people's code runs things like FastAPI or Octoprint or whatever.

33:16 Your stuff rewrites people's code.

33:20 Yeah, but at least it doesn't run at runtime.

33:22 I don't know.

33:22 I actually think it's easier.

33:23 Yeah.

33:25 Indeed.

33:26 All right.

33:26 I find you talk about the plugins thing because like I've actually very intentionally

33:30 taken the opposite approach, which is we have like almost no public API because like the only

33:35 public API is the CLI and like we don't expose our API in any other way.

33:39 And that's because like we know we're going to change like everything internally,

33:43 like pretty dramatically.

33:44 And so we wanted to have like full control over that without having to worry

33:47 about breaking people's stuff yet.

33:48 But it's like it's starting to become more of a problem because more and more people

33:51 want to use it as a library in like different ways.

33:53 But it's sort of a counterintuitive way to like make our lives easier as maintainers

33:58 was like not expose any public API apart from the CLI.

34:01 Yeah, very interesting.

34:02 That's a funny, funny sort of anecdote.

34:05 I'm rewriting a lot of the documentation for SQL model because I want to have examples.

34:10 Right now I have examples that are compatible with Python 3.7 and above,

34:14 but actually 3.6 and above.

34:15 But I want to have also the syntax for 3.9 and 3.10.

34:19 3.10, you can have like the unions using the vertical bar and these things.

34:23 And I want to have examples for each one of those.

34:25 So the approach I did was to write a script that will automatically update each one of the files

34:30 by calling rough as a soup process.

34:32 So that's the API.

34:33 And then like, you know, like I mean, the process is like doing all that stuff.

34:37 But like, yeah, it's like another fanboy of trying to use it as an API before it's available.

34:45 Yeah, with lack of an API, right?

34:47 An API will be created.

34:48 Exactly.

34:49 I've heard this before as like Hiram's law, which is like with a sufficiently

34:53 large number of users, like any implementation detail become someone will eventually rely

34:58 on an implementation detail.

35:00 Like any arbitrary implementation to someone is probably relying on that behavior,

35:03 which is basically the behavior of the program is the API.

35:05 And unfortunately, they'll find the underscore functions.

35:08 You've tried to dissuade them from using and all the things, you know, Eric,

35:12 what's the origin story for Read the Docs and what did you try and how do you think

35:17 it caught on?

35:17 Yeah, so I mean, this was kind of way back in the day, but yeah, I kind of got started

35:21 writing Django plugins, you know, apropos to the conversation.

35:25 You know, I was working at the Lawrence Journal world where Django came from

35:30 and it was kind of early in my career and I was just kind of getting excited

35:32 about open source and blogging and just basically built a few of these kind of testing related

35:37 open source projects and then that was kind of where I got started with open source

35:40 and then basically it was the classic scratch-on-itch thing, right?

35:44 Like it's like I have a bunch of open source projects I want to write documentation.

35:47 How do I solve that problem?

35:49 And back in the day that was a much harder problem to solve, right?

35:52 It was basically just like build a zip file and upload it to packages.python.org

35:56 if folks remember that one or was it packages or whatever the docs, there was a docs hosting

36:02 on PyPI basically.

36:03 And yeah, basically just wanted to kind of build a better version of that

36:06 that in the integrated with GitHub.

36:07 I feel like web hooks were like the cool new thing back in 2010.

36:11 And so that was really kind of the insight, right?

36:14 It's like let's build this kind of like CICD workflow on top of web hooks

36:18 and actually did build kind of a version of that the previous year around kind of like

36:22 code quality stuff.

36:23 So it actually ran kind of like a linter and built a website on commit and had a similar

36:27 kind of workflow, right?

36:29 Where it like gave you a grade and did all this kind of stuff, which is like 2009.

36:33 And yeah, that didn't really catch on at all.

36:35 But then I think Read the Docs just we built it and then I was using it for my own projects

36:39 and I actually had the need to kind of maintain it and keep it updated.

36:42 And then I think people just kind of grew naturally, you know, gave some conference talks,

36:46 that kind of stuff.

36:46 But I think it just solved a problem that people had and that's always going

36:49 to be the best way to grow a thing.

36:52 Yeah, absolutely.

36:53 Awesome.

36:54 What's Read the Docs written in?

36:55 Is it Django?

36:56 Yeah, it's all Django and Python.

36:57 Funny coincidence.

36:59 I went to college in Lawrence at the University of Kansas.

37:02 Oh, nice.

37:03 I was right there, right at the heart of Django, but I moved off to grad school

37:08 like a couple years before all that happened.

37:10 So I missed, missed the excitement.

37:13 I grew up in Virginia and everyone was like, you're going to Kansas?

37:15 You graduated school?

37:16 Like, how are you going there?

37:18 Like, what?

37:19 Everybody thought it was the weirdest decision, but yeah, like I really do think,

37:22 you know, ending up in that Python and Django ecosystem has been pretty transformative

37:25 to my life.

37:26 So, you know, worked out.

37:27 Lawrence is a pretty cool little town, actually, of all the places.

37:30 Yeah.

37:30 Sebastian, how did you come about this crazy idea to put types into our web apps?

37:36 You know, Python, that's dynamic.

37:38 It doesn't have types.

37:38 What are you doing?

37:39 Yeah, I don't know.

37:40 It's so crazy.

37:41 It's so fun to see it said Michael Larson in the chat, like, they maintain

37:45 our URL E3 and the Python security developer in Resilience just, like, chatting along with us.

37:52 Like, he probably has had to deal with so much stuff as us.

37:56 Yeah, I'm sure.

37:57 So, like, some of the first things that I did in open source were actually

38:01 Docker images for deploying Flask because I was working with Flask and deploying Flask

38:07 was difficult and I needed to be able to combine Nginx with UWSGI and, like,

38:12 a bunch of things and, like, they all had their own custom configuration files

38:16 and it was, you know, like, so difficult.

38:17 I didn't like doing that and then I just had to study how to do that stuff

38:22 and then after going through all that I wanted to save everyone else's time

38:26 doing that.

38:27 So, we're like, well, let's just put a Docker image with this and a lot of documentation

38:31 of how this Docker image works and how you can use it with some sensible defaults.

38:35 So, you know, it was just like a weird contraption that was it but it actually grew

38:40 and, like, got, like, a few stars, like, a bunch of stars.

38:43 For me, it was a lot, you know, like, 100 stars.

38:45 Oh, my gosh, I have an open source developer.

38:47 And then, like, at some point it had, like, a thousand stars or something like that.

38:51 I was so happy about that.

38:52 And at some point it was kind of the de facto standard for doing Flask, Docker,

38:57 Flask-indocker.

38:58 that was the first thing that I did.

38:59 I ended up with FastAPI.

39:01 I was avoiding building FastAPI for a long while and I was trying all the other frameworks

39:06 and all the other tools.

39:07 I was convinced that there was something that would do the things that I wanted.

39:11 I just had to find it.

39:12 And as I was trying different frameworks, also in different languages, I was extending

39:17 the list of things that I wanted to have and also the list of things that I wanted

39:21 not to have.

39:22 For example, I didn't want to...

39:23 That takes you farther and farther away from any framework so you're out.

39:27 having one that would tickle the boxes.

39:28 So it was like, ah.

39:29 But then I realized I really like this thing of having types because you get out

39:34 of completion and inline errors and this is so cool.

39:37 It's so cool to be able to have this.

39:38 I want to have this in Python and then Python added type annotations and it was like,

39:42 this is great.

39:43 How do I use them?

39:44 There's no way to use them with the current frameworks.

39:46 So at some point I actually found the right framework.

39:50 It was called API Star by the same author of Django REST framework.

39:53 It was just missing some authentication stuff.

39:55 I said like, okay, I'm going to contribute to the other stuff.

39:58 When I was about to jump into the code, he said, I have to deprecate this.

40:02 I will go focus full on Starlet.

40:04 And then he went to build Starlet.

40:06 This is Tom Christie, which is super prolific and an amazing open source person

40:10 in general.

40:11 And then at that point is when I said like, ah, just have to try it.

40:15 Let's just do it.

40:16 So I'm just going to try to build something that will be kind of a spiritual successor

40:20 to API Star built on top of Starlet.

40:23 So I was, you know, like I was actually narrating all the learnings from Flask,

40:27 Django, Django REST framework and all the ecosystem and just like bringing

40:31 all those ideas together.

40:32 At least that was my intention.

40:33 And then I wanted to have a bit of better type annotations.

40:36 So I saw that Pydantic was using standard type annotation.

40:39 So people wouldn't have to learn this like, you know, from FastAPI for special string

40:44 or something like that.

40:45 Just instead of that, just use pure string.

40:46 So I wanted to have something based on standards like OpenAPI, JSON schema

40:51 and all that stuff and based on standard Python and to have like the simplest syntax possible

40:56 and to, you know, like give the best developer experience possible while,

41:00 you know, like not adding like any additional steps for developers to build something

41:05 that by default will have all the best practices built in.

41:08 That was the intention.

41:09 And I was just like trying to solve it for the things that I was working on.

41:12 I was supposed to be doing AI and machine learning and stuff, but like I had to stop

41:17 for a bit to solve APIs.

41:18 I got stuck in APIs.

41:20 That's how I ended up with FastAPI.

41:22 Oh, I think you made a pretty decent choice.

41:24 It seems like FastAPI is doing all right.

41:26 Yeah.

41:27 Yeah, I just saw you.

41:28 It's much better than what I ever had expected.

41:31 Yeah, I know.

41:31 Congratulations.

41:32 Well, it's also deserved, but I also just saw an X, I don't know, a post on X Twitter,

41:38 whatever you, however you, addressed these things, where you said you showed a graph

41:43 where the number of GitHub stars for FastAPI just passed Flask.

41:48 And, you know, I have a lot of respect for Flask and the Palette team and David Lord

41:52 and all those folks, but, you know, awesome, awesome that your stuff has taken off so much.

41:56 That's really cool.

41:57 It's super cool.

41:57 It's amazing.

41:58 And, you know, like Flask was one of the big inspirations for FastAPI, and I've been able

42:02 to be at this point.

42:04 It's crazy.

42:05 Like, yeah, I still can't get over it.

42:07 Yeah, super cool.

42:08 super cool to be able to build all this and to keep building more stuff.

42:11 So, yeah, super nice.

42:13 one final comment before we move on to Octoprint.

42:16 But, one of the things I kind of see you doing in the world is you're like

42:21 the combiner.

42:22 You're like, oh, we've got this cool stuff with Pydantic and Starlet, and how can we combine it

42:27 in this way to make this, you know, and Swagger.

42:29 And, like, similarly with SQL model, you're like, well, Pydantic is cool,

42:32 but SQLAlchemy is kind of cool, but it could be more or better, you know,

42:36 like, it could be better, right?

42:37 So, anyway, good job.

42:38 Yeah, and also, like, Typer, that is the library for building command line applications.

42:42 It just click with the type annotations, the same ideas from Pydantic, and now with,

42:46 you know, like, integrated building support for reach.

42:48 So, like, also, picking Will's work, trying just to put a bunch of things together.

42:54 I'm just, you know, like, I'm just making cocktails everywhere.

42:57 Yes, exactly.

42:58 It's more than that, but there is a lot of value in combining things in a smart way

43:02 and accessible way.

43:03 Yeah, awesome.

43:04 All right, Gina, you told us a little bit about the origin story, but like,

43:08 what did you try before?

43:08 And then I have a follow-up question that I think is unique to your project.

43:12 I wouldn't necessarily say that I tried anything before because the whole thing

43:16 was completely unintentional.

43:18 I basically bought myself a 3D printer in late 2012.

43:21 I wanted to be able to put it in my spare bathroom and monitor it from afar

43:25 because back then this thing was tying up my PC.

43:28 You had to constantly keep it connected so it could operate and that for hours

43:32 and hours and it made noises and it produced fumes and I just wanted it out of my office

43:37 and to be able to play games on my PC again instead of having it basically communicate

43:43 constantly with a 3D printer.

43:44 And so I bought myself a Raspberry Pi and I was looking online for something

43:48 to be able to just put on this Pi and attach to the printer and throw a Wi-Fi dongle in

43:52 because back then the Pi didn't have Wi-Fi built in and throw that in the spare bathroom

43:56 but there wasn't anything.

43:57 So over the course of my Christmas break in 2012 I sat down and changed that

44:02 and this is basically the origin story of Octoprint.

44:05 I just wanted to scratch my own itch.

44:07 I wanted to put my printer in my spare bathroom.

44:09 This is all.

44:10 And apparently a lot of people had the same problem because I just you know

44:14 like how we like to do these things.

44:16 We build something that we think might be interesting.

44:19 We throw it up on GitHub and go just like here go nuts enjoy have fun with that

44:23 and I suddenly started getting emails from all around the world like hey

44:27 I have this in this printer can you also make it work with that and so this escalated

44:31 and I went like oh someone is using it of course I'm going to add this support

44:36 and of course I'm going to add this feature and it just grew and grew and grew

44:40 and grew and apparently I just hit a nerve so this was utterly unplanned

44:44 this was never my intention at all and I just wanted to solve my own problem

44:49 and have continued to solve my own problems and the problems of other people

44:53 ever since.

44:54 Before Octoprint I actually was also quite active in a little project called DocuViki

44:58 where I was developing some plugins for that and I even did open source before I knew

45:04 what open source was with some PHP scripts when I was 18 or so that I threw up

45:09 on my website but yeah Octoprint was like it took over my life it just was an accident

45:15 a happy little accident maybe.

45:17 How did you decide okay this is a job for me rather than just a thing you worked on?

45:23 The thing is by mid-2030 2013 I went to 80% on my regular day job I used to be a

45:30 software architect slash consultant with big corporation Java World all the enterprise stuff

45:35 and to be able to dedicate one day per week fully to Octoprint plus of course

45:40 the weekends and the after hours and the vacations and all of that and that still

45:44 didn't suffice anymore by 2014 and I noticed that it was impacting my health

45:49 it was impacting my relationships and that was actually quite perfect timing

45:54 really when this company that hired me initially approached me and said hey do you want

45:59 to maybe fly out to us and we'll chat and if you like all of that what we have to propose

46:03 then we can just do that and this is how it then continued to go from 2014

46:08 until 2016 and yeah it was never my intention to become self-employed I'm a quite

46:14 risk-averse person actually so when this point came where I was like okay either

46:19 I find a way to keep funding this or I have to really drop it because it was

46:24 way too big by then to be kept as a pet project without being utterly utterly unhealthy

46:29 yeah I decided to jump into the cold water and have been trying to keep up

46:33 at the surface ever since basically so yeah all of that really completely

46:38 unplanned cool what an adventure indeed yeah and the good thing is even if people don't

46:43 understand what open source is or what code is I always have quite a topic

46:46 at parties so that is fun because yeah like people give you money for something

46:51 they can get for free what exactly yeah if you're not familiar with open source

46:56 then it definitely is a weird it was tricky to find a text consultant who understands

47:00 the concept so yeah I can imagine that's interesting I'm sure all right I was very

47:06 recently I was like what do you do what is your day oh I'm a software developer

47:10 so you work for a company not really what is it that you build well I build

47:15 a platform that is free for others to use and who's paying you a company

47:20 that pays money to companies to build companies so you're building a company

47:23 no it's actually you know like it was a long conversation they got bored

47:27 and later this doesn't make any sense yeah I've just taken to say I'm a software

47:32 developer and I work with 3D printers and then people usually stop asking questions

47:37 because 3D printers are this mysterious thing that no one understands anyhow

47:40 usually at least and then yeah unless they say oh 3D printers and then I say

47:45 yeah do you know 3D printers and they go yeah yeah I have one and then I can say

47:49 oh do you know Octoprint yes oh yeah I made that and then oh yeah it's tricky to explain

47:53 to people I'm sometimes not even sure my parents understand what I do so

47:57 I'm sure that my parents don't understand what I do that's okay I'm sure

48:03 they're still proud of you anyway it's fine yeah my definitely are proud of you

48:06 I would like to just maybe getting a little short on time you're coming up

48:09 to the end of our Avengers meeting let's close it out with this go around

48:13 one more time let y'all or maybe just as a group kind of chime in on this

48:17 speaking to the people out there listening who want to start an open source project

48:20 or want to contribute to open source or somehow kind of get involved in similar ways

48:24 what would you do different if you started now many of you have been working

48:28 on this for a long time you've had a lot of experience like if somebody said

48:31 well the world is somehow the memory has been erased from the fact that rough

48:37 or rich or octafrid or whatever existed to start over what would you do different

48:42 or the same I would use FastAPI yay good use of a time machine there everybody

48:48 I've had multiple conversations over the years where people are like why don't

48:51 you use this library I'm like oh it didn't exist exactly yeah this is the

48:55 problem exactly when you actually have a plug-in system then swapping out

48:59 stuff like that can become very tricky absolutely when I get asked what to work

49:04 on what to study what to focus how to get into open source or like almost any

49:09 of those questions I always say that the main advice I give is just to focus

49:13 on a problem that is important to you more than you know like innovation

49:18 market disruption or war whatever just like focus on a problem that is actually

49:22 important to you hopefully that is important to others as well and if it's not

49:26 a problem that affects you directly hopefully it affects someone that is

49:29 very close to you so you can get like a very tight feedback loop of what

49:33 you are building and then try to solve it and then use that as the guide

49:37 of what to do what to learn what to focus on what to do in many cases it's just

49:42 learning a framework that is already there you know like why would I go and build

49:46 a system to control 3D printers instead of just like learning how to use

49:50 auto print in many cases solving the problem is just like using the tool

49:54 that is already there but then in some cases you end up figuring out that there's

49:58 no tool and you just have to build it there's actually no lint there and formatter

50:03 that can be super fast so you can run it every time you just hit save so then

50:07 you just have to build it in Rust and create rough or like you know like

50:10 there's always like this thing that you are trying to solve that is just

50:15 not solved there yet and that is what gives you the best value and the best

50:19 outcome in many cases it can be just like you know contributing to another

50:23 open source project or building something new but the thing is like for me

50:28 it's just like focusing on a problem that is important that is what has worked

50:33 for me at least good advice I would add to that that you really shouldn't

50:36 try to you need to be really passionate about the thing as well right it

50:40 needs to be something that is really something you're into something that

50:43 will that you will want to spend a lot of time on that is actually not your

50:48 working hours and such because otherwise the whole jog until this becomes

50:53 anything viable anything big enough to support you in any kind of way even

50:57 if it's just being able to drink a coffee per week or something that will

51:02 be a quiet long slog and a lot of work and a lot of blood and sweat and tears

51:07 and so you really need to be into this so that you want to do that if you

51:11 are just in that for the end goal of I don't know becoming rich through open

51:15 source which by the way will probably not work only will I go rich then this

51:21 will not work out you need to focus on the path to the goal a lot of people

51:26 try to reach for the end goal before they are willing to walk the path I

51:32 happen to be in the GitHub star program and I've had a lot of people ask

51:37 me how do you become a GitHub star and that is the wrong question to ask

51:41 how do you become an open source maintainer of a popular project you just

51:46 have to do whatever you are interested in you have to do work and you have

51:51 to be passionate about your work and then maybe if you hit the right nerve

51:54 then that will happen and maybe it won't I think it's very interesting that

51:58 none of us had a career path to where we are now we didn't set out to be

52:04 where we are now it just feels like we followed our intuition and it worked

52:09 out which means it's very difficult when someone asks me how do you become

52:12 an open source developer how do you start a company I'm not quite sure I can

52:16 tell you my path to there but it's very hard for me to articulate to someone

52:20 else how to get there I think there's a lot of luck involved as well right

52:24 it's like you have to do all this stuff and roll this dice if it gets a six

52:27 you can be successful there's an element of luck but it's kind of luck you

52:31 make for yourself and it might take you to somewhere else or it might not

52:36 but as long as you're passionate about it and you enjoy it then great things

52:39 will happen I think also Will and Charlie you both took some specific time

52:43 on your own money to really level up what you're working on which is pretty

52:48 brave not a lot of people would say I'm just going to spend my savings to

52:53 work on this project and see if I can make it go so you've earned some of

52:56 that through taking that chance and putting that time and effort I think

52:59 for me that didn't last long because I'm after 15 months I was living on

53:02 GitHub sponsorship VCs came along and then there was cash everything changed

53:07 and you had to learn a whole new set of skills I'm sure I do feel lucky that

53:15 like I said this is my first time being a maintainer and it was very clear

53:18 to me quickly that for Ruff to have the pace of development and the scope

53:23 that it had to be a full time thing and that was pretty obvious to me quickly

53:27 and I have a lot of respect for people who have been maintainers for longer

53:31 periods of time and in a way where it's not their full time job or they have

53:35 to do it on the side I have been in that position but it's already clear

53:39 to me that that takes a lot of dedication and commitment so I feel very lucky

53:44 that I get to work on open source full time I know it's not all entirely

53:47 luck right like you increase your luck surface area and opportunities come

53:51 your way but I do think it's a fortunate position that these kinds of opportunities

53:56 do exist because maintaining popular stuff is a lot there are privileges

54:00 that come with it 100% but it's a lot of work and a lot of stress and a lot

54:06 of responsibility and you don't necessarily have to start your own right

54:09 away I didn't have gray hair before this you don't have to start your own

54:12 either you could contribute to a really popular one and get into the scene

54:16 and you know like Eric that sounds a little bit like your story like you

54:18 were in the Django scene and then spun off from that what you are doing right

54:22 yeah definitely and you know part of an open source community and definitely

54:26 going to PyCon and just being surrounded by those people because that was

54:29 always the it's very lonely work just to have an inbox of github issues and

54:34 no inbox thank you you know and like going to conferences and that kind of

54:38 stuff was really where you feel the appreciation and you really kind of actually

54:42 feel the value that you're providing as well as just the stress of the things

54:47 you're breaking so absolutely the conferences are great to really feel the

54:53 appreciation rather than just the request they'll say thank you and then

54:57 they'll give you a bug report but at least the thank you I'm talking to you

55:02 there is this can I just show you this an interesting observation for me

55:08 a year ago I didn't know anyone in Python open source at all I was a user

55:15 of Python in my day job every day but I was not interacting with Python in a

55:19 year now like Sebastian we've interacted a bunch there's a lot of people

55:23 that I've come to know and think of as friends so I think especially if you're

55:28 interested in getting involved and putting in work I really don't think there

55:31 are significant barriers and you get out of it what you put in so I think

55:37 I've been very impressed with just how welcoming and friendly the community

55:39 has been especially other maintainers yeah absolutely talk to a lot of people

55:43 who show up at PyCon and they're like I was really nervous to come here or I feel

55:46 like it didn't fit in and they're you know just had such a great experience

55:50 and I said well did you feel like that was my first PyCon this year I'd never

55:54 been to a fight on conference and so I was like we did up at such an amazing

55:57 party that's true that was interesting all right guys well I think we are

56:06 pretty much out of time anyone want to have some final thoughts for listeners

56:10 before we wrap it up go and build some cool stuff who's brave enough how

56:15 can maintain it today I think give cake not puppies let's leave it with that

56:18 huh all right give cake not puppies and be really careful before you start a

56:22 popular source project it might take over your life if you want this great

56:27 but if not then yeah careful what you wish for you might get it exactly Gina

56:31 Sebastian Eric Will Charlie thank you all for being on the show this has

56:36 been a a ton of fun thank you very much for having us a pleasure and honor

56:39 to be with these amazing people thank you for the invitation I agree honestly

56:43 I had a blast just hearing everyone's stories because I hadn't heard any

56:46 of this before so thanks thanks to everyone else and thanks Michael yeah

56:49 you bet bye bye bye bye bye this has been another episode of talk python

56:53 to me thank you to our sponsors be sure to check out what they're offering

56:57 it really helps support the show this episode is sponsored by base dash base

57:03 dash uses AI to build a dashboard for your database get a custom admin view

57:08 in your postgres Microsoft SQL server my SQL Maria DB or Redshift database

57:14 get started for free at talkpython.fm/base dash take some stress out of

57:20 your life get notified immediately about errors and performance issues in your

57:24 web or mobile applications with Sentry just visit talkpython.fm/sentry

57:30 and get started for free and be sure to use the promo code talkpython all one

57:34 word want to level up your python we have one of the largest catalogs of python

57:39 video courses over at talkpython our content ranges from true beginners to deeply

57:44 advanced topics like memory and async and best of all there's not a subscription

57:48 in sight check it out for yourself at training.talkpython.fm be sure to subscribe to

57:53 the show open your favorite podcast app and search for python we should be right

57:57 at the top you can also find the iTunes feed at /itunes the Google play

58:02 feed at /play and the direct RSS feed at /rss on talkpython.fm

58:07 we're live streaming most of our recordings these days if you want to be part of the show and have your comments featured on the air

58:13 be sure to subscribe to our YouTube channel at talkpython.fm/youtube

58:18 this is your host Michael Kennedy thanks so much for listening I really appreciate it now get out there and write some Python

58:24 code Music Music Music Music Music Music

Talk Python's Mastodon Michael Kennedy's Mastodon