CINXE.COM

10 years of sustainable open source - Read the Docs

<!DOCTYPE html> <html lang="en"> <head> <title>10 years of sustainable open source - Read the Docs</title> <meta charset="utf-8" /> <meta name="generator" content="Pelican" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <meta property="og:site_name" content="Read the Docs" /> <meta property="og:type" content="article" /> <meta property="og:title" content="10 years of sustainable open source" /> <meta property="twitter:title" content="10 years of sustainable open source" /> <meta name="description" content="Reflecting on 10 years of working on open source full-time" /> <meta property="og:description" content="Reflecting on 10 years of working on open source full-time" /> <meta property="twitter:description" content="Reflecting on 10 years of working on open source full-time" /> <meta property="og:image" content="/images/10-year.jpg" /> <meta property="twitter:image" content="/images/10-year.jpg" /> <meta name="tags" content="meta" /> <meta name="tags" content="open-source" /> <meta name="tags" content="sustainability" /> <meta name="tags" content="anniversary" /> <meta name="author" content="Eric Holscher" /> <meta property="article:published_time" content="2024-08-26" /> <link rel="apple-touch-icon" sizes="180x180" href="https://about.readthedocs.com/theme/img/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="https://about.readthedocs.com/theme/img/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="24x24" href="https://about.readthedocs.com/theme/img/favicon-24x24.png"> <link rel="icon" type="image/png" sizes="16x16" href="https://about.readthedocs.com/theme/img/favicon-16x16.png"> <link rel="shortcut icon" href="https://about.readthedocs.com/theme/img/favicon.ico"> <link href="https://about.readthedocs.com//feeds/atom.xml" type="application/atom+xml" rel="alternate" title="Read the Docs Atom Feed" /> <link href="https://about.readthedocs.com//feeds/meta.atom.xml" type="application/atom+xml" rel="alternate" title="Read the Docs Categories Atom Feed" /> <link rel="stylesheet" type="text/css" href="https://about.readthedocs.com/theme/css/site.css" /> <script src="https://kit.fontawesome.com/53af4251af.js" crossorigin="anonymous"></script> <script src="https://about.readthedocs.com/theme/js/vendor.js"></script> <script src="https://about.readthedocs.com/theme/js/site.js"></script> <script async type="text/javascript" src="/_/static/javascript/readthedocs-addons.js"></script><meta name="readthedocs-project-slug" content="readthedocs-about" /><meta name="readthedocs-version-slug" content="latest" /><meta name="readthedocs-resolver-filename" content="/blog/2024/08/10-year-anniversary/" /><meta name="readthedocs-http-status" content="200" /></head> <body> <div class="ui basic fitted attached segment"> <div class="ui container"> <div class="ui middle aligned grid"> <div class="four wide computer five wide tablet eleven wide mobile left aligned column"> <div class="ui horizontally fitted basic segment"> <a href="https://about.readthedocs.com/" aria-label="Read the Docs homepage"> <img class="ui image" src="https://about.readthedocs.com/theme/img/logo-wordmark-dark.svg" width="220" alt="Read the Docs logo"/> </a> </div> </div> <div class="five wide mobile only right aligned column"> <div class="ui wide dropdown" data-module="dropdown" data-action="select"> <i class="fad fa-bars large icon" style="--fa-secondary-opacity: 0.8;"></i> <div class="menu"> <div class="header">Log in</div> <a class="item" data-analytics="community-login" href="https://app.readthedocs.org/dashboard/"> <i class="fad fa-people-group primary icon"></i> Read the Docs Community <p class="ui mini grey text"> <code>https://readthedocs.org</code> </p> </a> <a class="item" data-analytics="commercial-login" href="https://readthedocs.com/dashboard/"> <i class="fad fa-building secondary icon"></i> Read the Docs for Business <p class="ui mini grey text"> <code>https://readthedocs.com</code> </p> </a> <a class="item" data-analytics="signup-modal" onclick="jQuery('#signup-modal').modal('show');"> <i class="fas fa-plus primary icon"></i> Sign up </a> <a class="item" href="/choosing-a-platform/"> <i class="fad fa-circle-question grey icon"></i> Choosing a platform </a> <div class="divider"></div> <div class="header">About</div> <a class="item" href="https://about.readthedocs.com/features/"> <i class="fad fa-arrow-progress primary icon"></i> How Read the Docs works </a> <a class="item" href="https://about.readthedocs.com/pricing/"> <i class="fad fa-diagram-venn primary icon"></i> Pricing </a> <a class="item" href="https://about.readthedocs.com/pricing/enterprise/"> <i class="fad fa-briefcase primary icon"></i> Enterprise plans </a> <div class="header">Features</div> <a class="item" href="https://about.readthedocs.com/docs-as-code/"> <i class="fad fa-pencil primary icon"></i> Authoring features </a> <a class="item" href="https://about.readthedocs.com/features/#building"> <i class="fad fa-gears primary icon"></i> Building features </a> <a class="item" href="https://about.readthedocs.com/features/#hosting"> <i class="fad fa-browser primary icon"></i> Hosting features </a> <a class="item" href="https://about.readthedocs.com/features/reader/"> <i class="fad fa-glasses primary icon"></i> Reader features </a> <div class="divider"></div> <div class="header">Updates</div> <a class="item" href="https://about.readthedocs.com/blog/"> <i class="fad fa-newspaper fa-swap-opacity primary icon"></i> Blog </a> <a class="item" href="http://status.readthedocs.com" target="_blank"> <i class="fad fa-circle-check fa-swap-opacity primary icon"></i> Status <span class="description"> <i class="fad fa-external-link icon"></i> </span> </a> <div class="header">Help</div> <a class="item" href="https://docs.readthedocs.io/page/support.html" target="_blank"> <i class="fad fa-envelope primary icon"></i> Support <span class="description"> <i class="fad fa-external-link icon"></i> </span> </a> <a class="item" href="https://docs.readthedocs.io" target="_blank"> <i class="fad fa-book primary icon"></i> Documentation <span class="description"> <i class="fad fa-external-link icon"></i> </span> </a> <a class="item" href="https://docs.readthedocs.io/page/tutorial/" target="_blank"> <i class="fad fa-rocket primary icon"></i> Tutorial <span class="description"> <i class="fad fa-external-link icon"></i> </span> </a> </div> </div> </div> <div class="twelve wide computer eleven wide tablet left aligned tablet only computer only column"> <div class="ui big borderless secondary menu"> <div class="ui wide dropdown item" data-module="dropdown" data-module-on="hover"> Product <i class="dropdown fad fa-caret-down icon"></i> <div class="menu"> <div class="header">About</div> <a class="item" href="https://about.readthedocs.com/features/"> <i class="fad fa-arrow-progress primary icon"></i> How Read the Docs works </a> <a class="item" href="https://about.readthedocs.com/pricing/"> <i class="fad fa-diagram-venn primary icon"></i> Pricing </a> <a class="item" href="https://about.readthedocs.com/pricing/enterprise/"> <i class="fad fa-briefcase primary icon"></i> Enterprise plans </a> <div class="header">Features</div> <a class="item" href="https://about.readthedocs.com/docs-as-code/"> <i class="fad fa-pencil primary icon"></i> Authoring features </a> <a class="item" href="https://about.readthedocs.com/features/#building"> <i class="fad fa-gears primary icon"></i> Building features </a> <a class="item" href="https://about.readthedocs.com/features/#hosting"> <i class="fad fa-browser primary icon"></i> Hosting features </a> <a class="item" href="https://about.readthedocs.com/features/reader/"> <i class="fad fa-glasses primary icon"></i> Reader features </a> <div class="header">More</div> <div class="item"> <i class="fad fa-rectangle-terminal primary icon"></i> Featured tools <i class="dropdown fad fa-caret-right icon"></i> <div class="menu"> <a class="item" href="https://about.readthedocs.com/tools/sphinx">Sphinx</a> <a class="item" href="https://about.readthedocs.com/tools/mkdocs">Mkdocs</a> <a class="item" href="https://about.readthedocs.com/tools/jupyter-book">Jupyter Book</a> </div> </div> </div> </div> <a class="item" href="https://about.readthedocs.com/pricing/"> Pricing </a> <div class="ui wide dropdown item" data-module="dropdown" data-module-on="hover"> Resources <i class="dropdown fad fa-caret-down icon"></i> <div class="menu"> <div class="header">Updates</div> <a class="item" href="https://about.readthedocs.com/blog/"> <i class="fad fa-newspaper fa-swap-opacity primary icon"></i> Blog </a> <a class="item" href="http://status.readthedocs.com" target="_blank"> <i class="fad fa-circle-check fa-swap-opacity primary icon"></i> Status <span class="description"> <i class="fad fa-external-link icon"></i> </span> </a> <div class="header">Help</div> <a class="item" href="https://docs.readthedocs.io/page/support.html" target="_blank"> <i class="fad fa-envelope primary icon"></i> Support <span class="description"> <i class="fad fa-external-link icon"></i> </span> </a> <a class="item" href="https://docs.readthedocs.io" target="_blank"> <i class="fad fa-book primary icon"></i> Documentation <span class="description"> <i class="fad fa-external-link icon"></i> </span> </a> <a class="item" href="https://docs.readthedocs.io/page/tutorial/" target="_blank"> <i class="fad fa-rocket primary icon"></i> Tutorial <span class="description"> <i class="fad fa-external-link icon"></i> </span> </a> </div> </div> <div class="right menu"> <div class="item"> <div class="ui floating top right pointing dropdown" data-module="dropdown" data-action="select" data-display-type="block"> <a class="ui"> Log in </a> <div class="menu"> <div class="header">Log in</div> <a class="item" data-analytics="community-login" href="https://app.readthedocs.org/dashboard/"> <i class="fad fa-people-group primary icon"></i> Read the Docs Community <p class="ui mini grey text"> <code>https://readthedocs.org</code> </p> </a> <a class="item" data-analytics="commercial-login" href="https://readthedocs.com/dashboard/"> <i class="fad fa-building secondary icon"></i> Read the Docs for Business <p class="ui mini grey text"> <code>https://readthedocs.com</code> </p> </a> <a class="item" href="/choosing-a-platform/"> <i class="fad fa-circle-question grey icon"></i> Choosing a platform </a> </div> </div> </div> <div class="item"> <a class="ui button" data-analytics="signup-modal" onclick="jQuery('#signup-modal').modal('show');"> Sign up </a> </div> </div> </div> </div> </div> </div> </div> <div class="ui modal" id="signup-modal" data-module="modal" data-inverted="true"> <div class="header">Get started with Read the Docs</div> <div class="content"> <div class="ui center aligned basic fitted segment"> <p> Which site best fits your project? </p> </div> <div class="ui stacking centered grid"> <div class="stretched row"> <div class="seven wide computer sixteen wide tablet column"> <div class="ui raised segment"> <div class="ui header"> Read the Docs Community <div class="sub header"> For free and open-source projects </div> </div> <div class="ui relaxed list"> <div class="item"> <i class="fad fa-lock-open primary icon"></i> Clone public repositories </div> <div class="item"> <i class="fad fa-eye primary icon"></i> Public documentation </div> <div class="item"> <i class="fad fa-rectangle-ad primary icon"></i> Ads supported hosting </div> </div> <div class="ui center aligned basic fitted segment"> <p> <b>Free</b> for open-source software. </p> <a class="ui primary center aligned button" data-analytics="community-signup" href="https://app.readthedocs.org/accounts/signup/"> Sign up </a> </div> </div> </div> <div class="seven wide computer sixteen wide tablet column"> <div class="ui raised segment"> <div class="ui header"> Read the Docs for Business <div class="sub header"> For commercial and non-free projects </div> </div> <div class="ui relaxed list"> <div class="item"> <i class="fad fa-lock-keyhole primary icon"></i> Clone private and public repositories </div> <div class="item"> <i class="fad fa-eye-slash primary icon"></i> Public and private documentation </div> <div class="item"> <i class="fad fa-users primary icon"></i> Team management for your organization </div> </div> <div class="ui center aligned basic fitted segment"> <p> Plans starting at <b>$50/month</b>. </p> <a class="ui primary center aligned button" data-analytics="commercial-signup" href="https://readthedocs.com/accounts/signup/"> Sign up </a> </div> </div> </div> </div> </div> </div> <div class="actions"> <a href="/choosing-a-platform/" class="ui cancel button"><i class="fad fa-circle-question grey icon" aria-hidden="true"></i>Choosing a platform</a> <a href="/features/" class="ui cancel button"><i class="fad fa-sparkles grey icon" aria-hidden="true"></i>Explore all the features</a> </div> </div> <main> <section> <div class="ui very padded docutils text container"> <div class="ui breadcrumb"> <a class="section" href="/">Home</a> <div class="divider"> / </div> <a class="section" href="/blog/">Blog</a> <div class="divider"> / </div> <a class="section" href="/blog/category/meta.html">Meta</a> <div class="divider"> / </div> <div class="active section">10 years of sustainable open source</div> </div> <div class="ui medium header"> 10 years of sustainable open source </div> <div class="ui text menu"> <time class="item" datetime="2024-08-26T00:00:00-07:00">Aug 26, 2024</time> <div class="item"> <div class="ui dropdown" data-module="dropdown"> <i class="fas fa-tag icon"></i> <i class="fas fa-caret-down icon"></i> <div class="menu"> <div class="header">Tagged</div> <a class="item" href="/blog/tag/meta.html"> <i class="fas fa-tag icon"></i> meta </a> <a class="item" href="/blog/tag/open-source.html"> <i class="fas fa-tag icon"></i> open-source </a> <a class="item" href="/blog/tag/sustainability.html"> <i class="fas fa-tag icon"></i> sustainability </a> <a class="item" href="/blog/tag/anniversary.html"> <i class="fas fa-tag icon"></i> anniversary </a> </div> </div> </div> <div class="right menu"> <div class="item"> Eric Holscher </div> </div> </div> <div class="ui divider"></div> <img class="ui big rounded centered image" src="/images/10-year.jpg" alt="Photo by Adi Goldstein on Unsplash"> <div class="ui basic center aligned segment"> <p><i>Photo by <a href="https://unsplash.com/@adigold1?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Adi Goldstein</a> on <a href="https://unsplash.com/photos/selective-focus-photography-of-assorted-color-balloons-Hli3R6LKibo?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Unsplash</a></i></p> </div> <div class="ui basic padded segment"> <p>Read the Docs was started at a <a href="https://www.ericholscher.com/blog/2010/aug/16/announcing-read-docs/">48-hour open source sprint in 2010</a>, and grew to become a large part of the Python documentation ecosystem within a few years. Based on that success and the stress that came with it, we <a href="https://www.ericholscher.com/blog/2014/oct/24/announcing-read-the-docs-for-business/">created a company</a> to focus on sustainability in 2014. We've been working on Read the Docs as a project for 14 years, and a company for 10 years.</p> <p>We're excited to be celebrating our 10 year anniversary, and wanted to reflect on the journey that we've been on. Not too many people get the opportunity to work on an open source project for this long, and we're grateful to the community that has supported us over the years.</p> <h2 id="our-sustainability-model">Our sustainability model</h2> <p>We tried a number of different ways to make a sustainable open source project, really a service, over the years. The model that works for us is a take on the classic "open core" model, but applied to a service versus the code base:</p> <ul> <li>We offer a free service (Read the Docs Community) for open source projects, supported by <a href="https://docs.readthedocs.io/en/stable/advertising/">a single non-tracking ad</a> on the documentation.</li> <li>We offer a paid service (Read the Docs Business) for companies that need private repos and additional benefits that make sense for larger organizations.</li> </ul> <p>We tried relying on donations and other optional support, but that didn't work at all, and left us struggling with <a href="https://ericholscher.com/blog/2018/feb/7/the-post-i-never-published/">mental health issues</a> and burnout. We tried a model where we focused on documentation consulting and services, but that mostly took time away from actually working on the core product that open source projects rely on. We also <a href="https://blog.readthedocs.com/czi-grant-announcement/">experimented with grant funding</a>, which was a much more aligned source of funding allowing work on the core product, but is a one-time source of funding.</p> <p>Our goal is to work on the core product each day, and <a href="https://ericholscher.com/blog/2016/aug/31/funding-oss-marketing-money/">our current model aligns the incentives</a> so that everyone who is using the product is supporting it in some way, and we can focus on making it the best it can be for all our users.</p> <h2 id="lessons-learned">Lessons learned</h2> <p>A few of the most important lessons from the last 10 years:</p> <ul> <li>You don't get extra points for being bootstrapped. People will compare you to proprietary, venture-backed services that have raised many millions of dollars. <strong>We compete by focusing on documentation, a niche too small for most venture-backed businesses</strong>. Venture-backed companies have to keep adding unrelated features in order to grow into other areas, and we can focus on our core competency.</li> <li>Keeping trust in the community is the most important thing, because we're nothing without our users. It's a cliche, but trust is hard to earn and easy to lose. We continually think about how to balance sustainability with the values of our users, and have made many decisions over the years about having "enough". <strong>We can't maximize profit and continue to keep the trust of our community.</strong></li> <li><strong>Contribution is easier for less complex parts of the code base.</strong> We worked for a long time to get contributors to the core <a href="https://github.com/readthedocs/readthedocs.org/">readthedocs.org repo</a>, but the complexity of the application makes it really hard to contribute. We've had more success with contributions on our Sphinx theme, Sphinx extensions, and other small Python &amp; JavaScript projects.</li> <li><strong>Being open source means capturing a small percentage of the value you create.</strong> Back before we had a sustainable business model, I would get upset about the number of people telling me about how valuable it was for them hosting it themselves inside their company, while not contributing anything back. Now that we have a sustainable model and focused on having "enough" to keep the project going, I can see the benefits of the code being used in many places, even if we don't get direct contributions from those users. Though I do still wish they'd contribute back :)</li> <li><strong>You have to be okay doing more with less.</strong> Similar to the above themes on focus and value capture, our team has to ruthlessly prioritize what we work on. This also sometimes means that our users are frustrated that we can't prioritize their issues, but that's a natural tension. We also can't take as many risks in what we work on, but continually refine our core offerings as much as possible.</li> </ul> <h2 id="gratitude">Gratitude</h2> <p>We are grateful to have a team of 4 folks working full-time on Read the Docs. The support of the Python community, the Django community, and the broader open source community has been very important to keeping us going over the years. We depend on the trust of the projects that use our platform, and we have a core value not to violate that trust. We're also thankful to be mostly bootstrapped, outside of 6% equity we gave to our initial incubator, so that we don't have to follow the <em>enshittification</em> path of many venture-backed companies.</p> <p>We are also grateful for the sponsored services for our Community site from many tech companies, most importantly <a href="https://aws.amazon.com/">AWS</a> and <a href="https://www.cloudflare.com/">Cloudflare</a>. This allows us to focus our funding on the team and core code base, rather than infrastructure costs.</p> <h2 id="next-steps">Next steps</h2> <p>Read the Docs started only supporting Sphinx, and now supports any documentation tool that generates HTML output. We've also finished up a large "magic removal" effort that has removed our modification of the documentation build process, reducing the confusion that users hit building locally versus on Read the Docs.</p> <p>This leaves us with a much simpler system:</p> <ul> <li>Our build system <a href="https://docs.readthedocs.io/en/stable/build-customization.html">now supports any documentation tool</a> and should work the same as other build environments.</li> <li>For built documentation we've added our <a href="https://docs.readthedocs.io/en/stable/addons.html">Addons system</a> which provides features for documentation readers on top of any tool.</li> </ul> <p>This new architecture allows us to support the documentation ecosystem as the tools evolve, and focus on making a great experience for documentation authors and readers. We're excited about everything that we've accomplished over the past 10 years, and hope that our new approach will give us another 10 years of supporting open source documentation.</p> </div> <div class="ui basic paddded center aligned segment"> <a href="/blog/" class="ui primary basic button"> See more posts from our blog </a> </div> </div> </section> </main> <footer class="ui basic very padded inverted attached segment"> <div class="ui container"> <div class="ui four column stackable grid very padded"> <div class="column"> <div class="ui vertical inverted text menu"> <h4 class="ui sub header">Stay updated</h4> <a class="item" href="https://about.readthedocs.org/blog/">Blog</a> <a class="item" href="https://landing.mailerlite.com/webforms/landing/t0a9l4">Newsletter</a> <a class="item" href="https://status.readthedocs.com/">Status</a> <div class="item"> <a href="https://github.com/readthedocs/" aria-label="Read the Docs on GitHub" rel="noopener noreferrer"><i class="icon large fab fa-github"></i></a> <a href="https://twitter.com/readthedocs" aria-label="Read the Docs on Twitter" rel="noopener noreferrer"><i class="icon large fab fa-twitter"></i></a> <a href="https://fosstodon.org/@readthedocs" aria-label="Read the Docs on Mastodon / Fediverse" rel="me"><i class="icon large fab fa-mastodon"></i></a> </div> </div> </div> <div class="column"> <div class="ui vertical inverted text menu"> <h4 class="ui sub header">Learn more</h4> <a class="item" href="https://docs.readthedocs.io">Documentation</a> <a class="item" href="https://docs.readthedocs.io/page/tutorial/index.html">Getting started guide</a> <a class="item" href="https://docs.readthedocs.io/page/config-file/index.html">Configure your project</a> <a class="item" href="/comparisons/github-pages/">Comparison to GitHub Pages</a> <a class="item" href="/comparisons/gitbook/">Comparison to GitBook</a> <a class="item" href="/comparisons/cloudflare-pages/">Comparison to Cloudflare Pages</a> </div> </div> <div class="column"> <div class="ui vertical inverted text menu"> <h4 class="ui sub header">Product</h4> <a class="item" href="/features/">Features</a> <a class="item" href="/pricing/">Pricing</a> <a class="item" href="/privacy-policy">Privacy Policy</a> <a class="item" href="/terms-of-service/">Terms of Service</a> </div> </div> <div class="column"> <div class="ui vertical inverted text menu"> <h4 class="ui sub header">Company</h4> <a class="item" href="/company/">About us</a> <a class="item" href="https://docs.readthedocs.io/page/support.html">Support</a> <a class="item" href="https://www.ethicalads.io/advertisers/?ref=rtd">Advertise with Us</a> <a class="item" href="https://dev.readthedocs.io/page/contribute.html">Contribute</a> </div> </div> </div> <div class="ui basic center aligned inverted segment"> <i class="fad fa-copyright icon"></i> Copyright 2022, Read the Docs, Inc &amp; contributors </div> </div> </footer></body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10