How I made my First Successful Open Source Project
My first successful open source project was Vim Bujo, a task manager that you can use straight from any vim session. You can access a general todo list, or a project specific one.
Coming up with the Idea
I typically use todo lists, but I've never been able to find anything better than good 'ol pen and paper. I've tried the most popular apps, but I just couldn't get into them. Switching screens from my work to mark something as complete just kind of ruined the flow for me. On top of that, all these apps were bloated with features I didn't want or need.
For many years, I just stuck to pen and paper, but I was always looking for something digital. There had to be some technology that gave me the satisfaction and organization of marking tasks as completed without interrupting my workflow! Well, I never found it...
I was getting into vim last year. You know how when you're learning about something new, you start to see it everywhere? Like, the first time I learned Mechanics, I would think about all the forces interacting whenever I took a step. Well, I was experiencing that, except for vim. One day, I was jotting my ideas on a todo list and I had an epiphany. "I can open a todo list straight from the file I'm working on!" And so spawned the idea of a Vim Bullet Journal, or, Vim Bujo. It was a vim plugin that I actually wanted to use.
I had no experience with building vim plugins, or using vimscript, the language vim plugins are written in. My first step was to checkout Steve Losh's "Creating a Full Plugin" from his book, Learn Vimscript the Hard Way. After skimming through, I was able to get a pretty good idea of the file structure, but was still lacking on specifics, and to be frank, did not have the time to read through the other 40+ chapters of Steve Losh's book. To fill this gap in my knowledge, I decided to learn my favorite way: reading other people's code!
I find just looking at other people's code is always a great way to get started. I don't mean copying, or anything. I just mean looking at functional code, logic flows, and more high-level components. I decided to check out some of Tim Pope's projects. He is one of the most famous and prolific vim plugin creators out there - and all his code is open source! Take advantage of things like this! It's a gold mine!
Well, from then on, I built the simplest version I can; it did everything it needed to do. When you typed ":Todo", a new file would open and dock to your window. From here, you can use keybindings to enter a new task, or mark one as completed. I tested it out, and it was exactly what I had been looking for. Okay, I probably overhyped it a little to myself since I'm the one that made it... But it felt good, and was definitely something I wanted to use.
Adding Git Integration
So far, I was pretty happy with my project! Someone ended up making a really good feature request, though. They asked if I can have git integration so that a project specific todo list would open up if you are in a git repo. It turned out to be pretty easy!
Git has a userful command called
git rev-parse --is-inside-work-tree. If this returned
true, we would
git rev-parse --show-toplevel to get the name of the toplevel directory and make a todo file named
after the project repo you are in.
Adding git integration wasn't a challenge at all, but I thought it was cool enough that I should include it! Also, git integration just makes my project sound cooler, and that's what it's all about, right?
Where do I Store the Todo Files?
Once git integration existed, I needed to think about where I'd be storing these files on users' computers.
I originally just had a dotfile at the root directory of the project, but this wasn't optimal. I would be annoyed
if I had yet another thing to add to each of my gitignores. Luckily, a user
presented a solution so simple it made me hit myself in the head. Just make a
~/.cache/bujo folder where all
this would be stored! It wouldn't bother users at all, and if that wasn't good for them, they can set their
own filepath in their vimrc.
I gotta admit, I am pretty bad when it comes to marketing. I have had some trouble building up an audience to share my creations with. Luckily, I had something genuine to share that communities tend to receive well. I wasn't trying to spam anyone, I wasn't trying to get something from them, I was just sharing what I made. Here were my most successful avenues:
r/vim on Reddit
My reddit post was probably the most successful avenue! I got 300+ upvotes, and engaged with around 20 people in the comments. They offered me feedback, and I implemented it. This was the most important part of getting people to use it.
The Primeagen is the person who got me into vim. His videos and streams are phenomenal and I love following him. I was also in his discord and asked him if I'd be able to share my plugin in his channel. He said yes, and on top of that, he even started using it! This didn't get me many users, but he started using it! Sometimes, when he's going through his .vimrc, I see my plugin! This was by far the coolest part for me.
This was the first thing I've ever made that people actually used. On github, people were contributing, logging issues, making feature requests, and even forking the project to expand on it! I ended with over 100 stars, which may not sound like much, but is a huge milestone for me.
The most important thing I learned here was to build things I want to use. If I find it useful, odds are somone else finds it useful too!
If you liked this, follow me on Twitter!