This is a transcript. For the video, see How do other open source projects develop and fund their work? A talk with Marijn Haverbeke - Part 1.

[00:00:00] Michael Meyers: Hello, and welcome to our Tag1 TeamTalk on how to grow, support, and fund your open source project. We have a really special guest today. Marijn Haverbeke, the founder of ProseMirror, CodeMirror, and Acorn.

It is so exciting to see that open source is more popular than ever, but sustainability has always been a really big challenge for open source projects. You know, a few projects really get off the ground. A lot of those projects that do quickly fade into obscurity and are no longer maintained but sometimes projects evolve into something amazing and sustainable. At Tag1, we're major contributors to open source projects and so we wanted to do a series of talks with founders of popular, open source projects to talk about how they got to sustainability. You want to encourage our listeners to do more, to support the projects that they rely on and we want to help founders of other open source projects, foster and grow their projects and community.

I'm Michael Myers, the managing director of Tag1 Consulting and joining us today for the conversation with Marijn is Kevin Jahns, the founder of Yjs, which is an open source framework that allows you to add collaboration to any application, and it's been used to add shared editing to both CodeMirror and ProseMirror, as well as Fabian Franz, who's the vice president of technology at Tag1 and Fabian is the core maintainer and framework manager who oversees Drupal 7. Which is the second most popular CMS after WordPress, it powers around 3% of the top 1 million websites. So there's a ton to cover today. We're going to do this in two segments.

This is the first segment, which could be a brief background. And then we're gonna talk a lot about growing a community of users and contributors. Please be sure to check out funding your open source project which is going to be part two. The link is in the description below. So Marijn, just to set the stage for the conversation, I'd be shocked if our listeners haven't heard of ProseMirror, CodeMirror or Acorn, but it would be great, you know, in your own words, if you could just tell us a little bit about these projects, right?

[00:02:16] Marijn Haverbeke: Yeah. Let's start with CodeMirror, which is the oldest of the three. CodeMirror is a coder, the third component library. That's browser JavaScript. So you can just use it to get like a kind of extended text area, which has some of the conveniences that you're used to in code editors. Acorn is a JavaScript parser, which is used by quite a few tools that transform or do something with javascript code and ProseMirror is the newest of the three is a structured text editor. So kind of like what you see is what you get editor, but with a more rigorous approach to the structure of the content.

[00:03:03] Michael Meyers: That's very modest. Acorn has what, over 7 million users use my, a few applications.

[00:03:11] Marijn Haverbeke: It's mostly just like transitive dependency. A few big projects use it. So that's produced a big user count in a way.

[00:03:22] Kevin Jahns: So my, my question is how, how did you get into this? Why did you start these projects?

[00:03:29] Marijn Haverbeke: For CodeMirror I was actually solving my own problem. I have this textbook about JavaScripts called Eloquent JavaScript, which has a, like an online version.

An integrated, that's kind of a code sandbox where you can just play around with code as you're reading. And yeah. Coding in a text area is really, really uncomfortable. So when I wrote this in 2007, I tried to build something a little bit better, and then it got a bit out of hand and led to the first version of a CodeMirror.

[00:04:05] Kevin Jahns: Oh, that's fun. It's - it reminds me of the story of the story of LaTeX. Where the author of LaTeX wanted to create a book. And he was like, I need to write the programming language first.

[00:04:16]Michael Meyers: What are some of the biggest challenges that you have as the founder and maintainer of these projects and communities?

[00:04:24]Marijn Haverbeke: I mean, it's a bunch of work, but it's. There's no real huge challenges that come to mind. It's mostly enjoyable.

[00:04:37] Michael Meyers: Yeah. Where, where does your time go then? It's a bunch of work. You know, how much time are you putting into these projects? You know, is it mostly development, reviewing contributions?

[00:04:49] Marijn Haverbeke: I'm working on this pretty much. Full-time I do a bit of consulting now and then, but it's mostly just work directly on the open source code. I think for the past years has been about 50, 50 half of my time goes into just maintenance and communication. And the other half have been working on new stuff. I've been rewriting CodeMirror to be like more up to date with current realities and there's been a huge project. So that's just been like new code and new design. That's yeah. That's basically how its been divided.

[00:05:32] Kevin Jahns: You're talking about CodeMirror 6, right, which is your newest project. Do you want to talk a bit about that?

[00:05:40] Marijn Haverbeke: Yeah. It's about three years since I started on that.

Now it's like a CodeMirror 5 is 10 years old. Well like that's range of compatible interface, 2.25 version 2.025 has been pretty much entirely backwards compatible for 10 years. And that means that it's really dated and yeah, it was time to start just rethinking the system, which is then of course, a invitation for like really exaggerated, over-design and a second system syndrome kind of thing. So yeah, it's a very different system now much more powerful, but also quite a bit more complex that I've yeah. I've tried to kind of catch up with the capabilities of Monaco, the codes that are in field scout, address accessibility concerns properly support touchscreen devices, and generally make the system designs quite a bit better. So that extensions don't get in each other's way. And you can do like really ambitious stuff like collaborative editing without getting into weird corner cases that the library doesn't handle. So, yeah, that's been my focus for the past years.

[00:07:08] Kevin Jahns: Yeah, just want to say, like I played around with CodeMirror 6 just recently, a few months back, and it's been a really good experience compared to CodeMirror 5 or even compared to ACE editor, which is what I was familiar with back then.

And it has a really nice API and the packing system. I can really imagine a huge ecosystem around CodeMirror 6 it's really, really cool what you've built. So

[00:07:32] Marijn Haverbeke: Well, that's great to hear.

[00:07:35] Kevin Jahns: Yeah. And I've, I'm working on a text editing and rich text editing on all your projects, basically. So yeah, so I just want to congratulate you, but also I want to know what how did you get into that?

Like, How did you start that? How do you start such a project? Because like, for me, when I start a project, I want to, I need to get funding or some income. You already have a big community, basically a lot of say in this community. And do you communicate with companies or do you, are you asking publicly?

[00:08:12] Marijn Haverbeke: So the thing that started the rewrite was that I heard about this prototype fund, which is a. Initiative from the German state where they just put 50,000 Euros in a starting open source project, if you can sell it well enough. And I had been thinking about like modernizing CodeMirror, but indeed is like, yeah, it was clear that it was a big project and that's it would be tricky to get funding and it was like a very.

We could add buzz words about accessibility and it was a pretty easy sell to to get the like many of these kinds of foundations are a gigantic paperwork to to get anything like it's almost not worth the time. But this one is it's really nice and that they try to actually make it's like a pleasant experience for the people who get funded as well.

So that was like, okay, we can I was I started the project together with Adrian Heine, my co-maintainer on CodeMirror. And yeah, we figured we can see, like work on this for half a year and see how far we get. And if it looks viable at that point, continue. So that's what we did and that worked out and then we had enough to show to start a Crowdfunder and got a bunch more money that way at that point, Adrian dropped out.

So I continued myself for a few years after that, but yeah, it was like at some points, the funding kind of ran out and I'm like now kind of hoping that this project is going to get successful enough to get like actual user funding, but that definitely covered most of the development work.

[00:10:06] Fabian Franz: Could you think that your, that your project could be like used in a huge code IDE like Visual Studio Code or something like that one day?

[00:10:21] Marijn Haverbeke: Yeah, there is brackets - Adobe's Editor IDE thing, which is built on CodeMirror 5. But that never took off to the extent that's at the Mark field scout did, but yeah, I think feature wise CodeMirror 5 already, and definitely CodeMirror 6 is powerful enough to build something like that on. And, that is kind of like In terms of determining the scope of the project is kind of awkward because it's used both by people who just want a fancy text area and people who are building an actual IDE. And yeah, it's definitely leaning more towards heavyweights, very intensive use cases than just getting syntax highlighting in your texts area at this point.

[00:11:11]Fabian Franz: Can CodeMirror 6 also do things like IntelliSense, like the , the expansion of, of things do you have structure for that just curious

[00:11:22] Marijn Haverbeke: You mean out to completion? Yeah. Yeah. Yeah. It has that built in it. Doesn't like a request I get often is whether it can talk to a language server, what are they called?

The thing that Microsoft invented for VS code and it's used by pretty much all editors now, but that's not available out of the box because it's quite awkward to, like, this protocol is designed for desktop use and doing that in a webpage is raising a lot of new questions that I haven't really had the time to solve yet.

[00:11:59] Fabian Franz: Yeah, for sure. I was just curious..

[00:12:03] Michael Meyers: Is there a secret to getting end users, people to use this? Have you noticed a catalyst or a common thread across your projects?

[00:12:15] Marijn Haverbeke: I think originally with CodeMirror, It was, there was nothing else really in this space, there were a few projects, but they were pretty bad compared to CodeMirror.

So it was like, a new thing that you could certainly do. And that, of course, like it was a slow uptake, but it was like a steady uptake because it was many people needed this thing. And I, and in the end, a lot of them ended up finding CodeMirror. Later there were some competitors, but then it was already like a household name.

And I think that that contributed to people keeping keep picking Codemirror, even when a Ace better later Monaco existed. And I think my other projects, it's kind of like a name recognition thing. Like I was already pretty known in the community because of CodeMirror and Eloquent JavaScripts.

And yeah, if you see three projects and one of them has an author behind them that, you know, I would definitely also pick the one that's where I know that they've developed something solid before or so it's probably. A safer bet. And I think that's contributed a lot to people choosing, for example, Acorn over Esprima, which is exactly as good a JavaScript parser as Acorn is a JavaScript parsers are kind of a commodity at this point. There's a bunch of them and they're all good. So yeah, people picking Acorn is I think just, Oh, thought that before. So let's go with that one.

[00:13:46] Fabian Franz: Or ProseMirror for that case for that case. You also choose Prosemirror because you had this does nice track record with service CodeMirror already so, we knew there was something behind it, et cetera, in our case withYjs.

So there wasn't that much choice, but it's great. How do you feel when big companies like Atlassian use your Prosemirror, like in their products and you know, that everyone that's using Confluence essentially is using a part of your software?.

[00:14:20] Marijn Haverbeke: Yeah, that's neat. So also a bit terrifying because I've never entirely convinced that it is going to work at that scale.

Every time I am in touch with them, I asked like, if it's still not major project problems and they keep saying no, no it's works. So it's always a surprise, but Yeah, it's cool. Especially since I don't have any strict legal requirements to be responsible if something goes wrong. So there, so like it's a different relation to be an open source provider and to be a commercial software provider, like a bit less stressful in that way.

I can do it just as a one person company without lots of stress and lawyers so. That's also. Kind of nice and yeah, yes and this funds development. So this is a definitely a satisfactory situation.

[00:15:16]** Michael Meyers:** What about growing your contributor base that, you know, do you have a lot of contributed to these projects? Is it mostly driven by you or a few people?

[00:15:28] Marijn Haverbeke: My projects are definitely very focused on me. I've never been good at like fostering a big community of contributors. Like CodeMirror of course has lots of contributors, but they're mostly like drive by provides a small fix or edit the language modes.

And I'm very protective of my code and like working with me, doing some, like, Tricky change to the core is not always easy, I think. And also like that's also a good thing because yeah, you see some projects just take on more and more complexity and at some points they're a mess and yeah, I'm definitely a control freak who tries to keep everything like in a scope and a style that I can deal with. A while ago, there was this thing going around the internet of some projects that's explicitly declared. Like this is open source, but it's not open contribution. I'm not taking any PRs and I'm not going quite that far. But there are definitely people with which I can work together, even on non like complicated, tricky things, but that's rare.

And I like - reviewing complicated scary changes from strangers who probably don't have the understanding of the system that I have is, is like really tiring. And not something I enjoy, like I'll often end up rewriting their stuff, which is extremely demotivating for them. But sometimes the only way I can get a feature in a shape where I actually believe that it's solid So I'm not really someone to look for advice on how to build a contributor base for, because yeah, I don't really have a lot of long term serious contributors to my projects.

[00:17:30] Fabian Franz: And I find that really, really interesting. There are so many ways in, in building open source projects, some are like thriving only with a contributor base and you're like, like managing it more yourself. So what could one say that you would prefer a feature request to a pull request in that case? Because you can probably easier work with a feature request then when you could all this code written already.

[00:18:00] Marijn Haverbeke:] Yeah. Yeah. Usually like that's just out of the blue that aren't like weren't discussed at all. Yeah. I don't have a very positive reaction to that. Sometimes it is possible to just work out a design and an issue, and then the person who wants it actually puts together a proper pull request that also happens.

But yeah. Usually it's less work for me to implement something than to review code and communicate and get things to a point where I like it.

[00:18:36] Michael Meyers:] So Marjin, a big problem that we've seen and even experienced ourselves. And, you know, a lot of people on our team is that when you become a major contributor to open source burnout sets in, you know, over time you're working so hard. Is that something that you've dealt with and have, you know, how do you manage that?

[00:19:03] Marijn Haverbeke: Yeah, definitely. There have been a bunch of points where I was not in a good relationship with my projects because they're just stressed me. And I've learned to deal with it better to a certain extent. Like every time I just dropped a bunch of responsibilities, like that felt like too much and I just stopped doing something or just completely stopped maintaining a project.

It's always been really liberating and Yeah. That's that happens a few times. Like Tern(.js) was relatively big project, which is like JavaScript code analysis engine providing like some IDE features for an annotated JavaScript, like not something that TypeScript is doing now for help people develop a JavaScript. That was a pretty cool project when it was first built, but it was kind of implemented in a messy way. And at some point it just felt like terrible and unrewarding work to keep handling issues for that. And I just stopped maintaining it and that wasn't that bad, like in the end, it's great that TypeScript replaces it and things move on also.

Just being really clear to yourself, like what, what you're going to do and what you're not going to do. It's something I've gotten better at, because if you'd take every request from every user, seriously, it can get really, really stressful, but you don't have to like, I've accepted that.

It's perfectly okay to leave. Issues from people who aren't explicitly paying me to work on this, just sitting for months, because I don't have time. It's like that happens. And it's yeah, it used to stress me out terribly, but it's yeah, I've come to accept that as part of this workflow.

[00:21:14] Fabian Franz: So you essentially have learned to say no to things.

[00:21:19] Marijn Haverbeke: Right. Yeah, I need to just decide, okay, I'm not going to do this and writes back saying, okay, this is not going to happen. Don't wait for, that's. Yeah. Usually at least people know what they're, what, they're, what they can expect. And that can also move on.

[00:21:39] Fabian Franz: Yeah. I mean, anyone could still decide to pay you for the work, so,

[00:21:44] Marijn Haverbeke: Right, yeah.

[00:21:47] Michael Meyers: I think learning how to say no is something that everybody struggles with, you know, as a consulting company, you know, saying no to new business when it's just not good for us, you know, we're not a fit for us, you know, at first that was really hard. And then you learn that it's better for everybody. So that's interesting.

What are the biggest barriers that you or your projects face right now?

[00:22:12]Marijn Haverbeke: I think the fact that I don't scale infinitely is definitely a thing. I felt that for example, the rewrite of Codemirror dragged on too long, but yeah. As someone working on their own, that's just the reality. Like if you have this ambitious scope is going to take a lot of time. So I'm trying to explicitly design the scope of my project so that I can actually handle them without stressing out. For example, by just saying no to certain things and making it so that they're modular enough that I can tell people, yeah, that's a good idea. You can implement it in your own extension and maintain it yourself.

It's not going to be in my core library.

[00:23:04] Fabian Franz: Yeah, this is something I noticed. Like you're pretty big on plugins, like creating plug-in systems and ensuring everything is pluggable that coming from a Drupal standpoint is also one of the things that made it great that essentially we have, we had lots of contributed modules where you could plug in into almost every part of the system .

And yeah, I think that's definitely one way to offload like work. Give people interfaces to interface with you and then let them do whatever they need to do.

[00:23:36] Marijn Haverbeke: Right. It definitely has a cost in terms of complexity. That's less sophisticated users to have to deal with, which is not great. But yeah, I've decided to go that way both, because it allows really, really ambitious, interesting extensions.

[00:23:52] And because, yeah, that means I can spread out maintenance burden a bit to other projects.

[00:24:01] Kevin Jahns: You just said that you don't scale infinitely and that's like really well put, I feel how would you like to solve that? Or do you want to solve that at all? Would you like to get more help from different people companies or

[00:24:20] Marijn Haverbeke: So for the longest time I did think that.

[00:24:24] Yeah. If I could just find some really cool co-maintainers to work with. That would be the way forward, but I've kind of learned about myself that I'm not really very good at cooperating, which is probably exactly the reason why I ended up doing what I'm doing. I had an enormous, just pathological control freak, and I really liked this feeling of just having the project entirely created in my image the way I like it.

[00:24:53] And I really like I worked on, on the risk compiler and a big team for example, at Mozilla for a year. And that was really interesting, but also so stressful for me to have all these decisions that some of them, I didn't agree with made in the project. And then I just had to live with them and that's yeah, every healthy developer that works in the team learns to deal with that, but I never really did.

[00:25:21] So. I just built my own sandcastles basically.

[00:25:24] Fabian Franz: Fortunately, you did not invent a Linux kernel.

[00:25:29] Marijn Haverbeke: Oh yes.

[00:25:31] Fabian Franz: I mean, Linus it's also has this kind of dictatorial style stuff.

[00:25:36] Marijn Haverbeke: Right. Like he's personally offended if someone wants to do something differently. Yeah.

[00:25:42]Fabian Franz: It's still, I mean,

[00:25:44]Marijn Haverbeke: it had a bit of that. I tried to be more diplomatic about it.

[00:25:49] Fabian Franz: I think it's it's important that there's different bleeding styles for open source projects. Again and also that for Linus, this system of having people he really, really, really could trust in the end worked out but, it took also years and obviously a Kernel is on a, on also on a little bit different scale and stuff..

[00:26:16] Marijn Haverbeke: Yeah. You could not maintain a Linux kernel by yourself. That's

[00:26:21]Fabian Franz: [00:26:21] I mean, integrate editor by itself, as we have seen.

[00:26:24]**Kevin Jahns: **I guess it's a bit less complex, but it's still pretty huge topic. I feel like writing an editor, there are a lot of opinionated people who like tell you how complicated it is. And I just scratched the surface and it's, it's, it's really touching a lot of different things. But for me, this answers like really cool question.

[00:26:47] I feel if Prosemirror and Codemirror would have been written by community, For me, it would have been really hard to get started. Like for me, I started using CodeMirror 6 and I was able to be productive in three days because I basically knew the plugin system from ProseMirror. It's like really opinionated way to do something.

[00:27:07] And it works very similarly and that's something I really appreciate and I have some experience with ProseMirror. So I was able to write plugins forCodeMirror 6 and So that's, I guess, advantage of having some authority dictator over this code who tells you this is a way how we do things and they are not seven different interfaces.

[00:27:29] So for the same thing that happens a lot in open source projects, I feel

[00:27:35] Marijn Haverbeke: Right. Yeah. I try to kind of protect people from their selves in my interface, in that I make it really hard to do things wrong because in a real time thing, like an editor, it's really easy to just make things terribly inefficient or break interaction with other plugins.

[00:27:58] But yeah, I don't think the group of people who are writing both against Prosemirror and Codemirror is that big. So yeah, that might not be a super relevance property of the systems.

[00:28:12]**Michael Meyers:**Before we wrap up Marjin. Is there anything that you'd like to promote or ask of our listeners where they can support you or your projects?

[00:28:25] Marijn Haverbeke: I'm trying to build my, like, financial product support on, on, on like companies, not individual hobbyists or enthusiasts because I think they have more money and they're they're the ones who should be paying if they're making a profit.

[00:28:45] But if you work at a company that is using my software yeah. Product, the right people to set up a contribution would be a really helpful thing.

[00:28:57] Michael Meyers: Awesome. I agree. I think contribution should come from companies, not individuals that are building open source. It just perpetuates the problem wonderful people, you know, support.

[00:29:10] And many of us as consultants do make money and, you know, it makes sense in some cases to do so. But Marjin, thank you so much for joining us. To our listeners, you know, make sure that you check out segment two funding, your open source project links we mentioned are going to be posted in the description.

[00:29:29] If you like this talk, please remember to upvote subscribe and share it. You can check out past Tag1 Team Talks at tag1.com/tagteamtalks .As always. We'd love to hear from you suggestions on topics or any feedback on the topics we've covered. You can email us at tagteamtalks@tag1.com. A huge thank you to all of you for participating today and thank you to all our listeners for joining us.

[00:29:55] Take care.