What is a hobby project?
A hobby project is a project that somebody is developing and (hopefully) maintaining in their free time, as a form of recreation.
Their life does not revolve around that project. Even though they have fun working on it, they do not want to spend the entirity of their free time on it.
Note that this page is written with a focus on software projects, but you can apply the same principles to other fields.
What does this mean for users?
The time the maintainer spends on the project is rather limited, and a lot of time may pass between burts of activity. Also, they'll likely focus on doing the things they enjoy.
This might impact users in several different ways. See below for a non-exhaustive list. Note that not all hobby projects are alike, and while some might be affected by all of these examples, others could be by only one or two. Also, there very well could be other problems not listed here.
- There are no reliable timelines for what gets done when.
- Considerable time may pass before bugs are fixed.
- The same applies to feature development.
- It also can take a while to get support if you run into problems.
- Documentation may be incomplete or non-existing.
- The same applies to automated tests, which might cause breaking changes or regressions.
- Some features may never be implemented, because they are too complicated, time-intensive or annoying to maintain.
- The same applies to optimisations, meaning a program may be larger, slower or resource-intensive (e.g. CPU, RAM, …) than it could be.
- The project may be abandoned at any time.
- etc.
Note that by using a hobby project, you also accept the consequences. The maintainer owes you nothing and you are not entitled to anything!
Information for developers
If you are a programmer you'll likely have a pile of ideas that you'd like to implement one day. These are sometimes called side projects , but let's call them hobby projects, because that clearly expresses their nature as something done for fun.
Hobby projects are in permanent danger of being abandoned, as they are often not very important to their creators. Thus once they stop being fun, free time becomes sparse or something more interesting comes along, they usually don't last long.
This document is intended to make total abandonment less likely. For that purpose it explains the concept and its impact to users. It also provides a few suggestions for you as a developer on what to do to keep the project fun and managable, and how to make it enduring from a technical perspective.
However, please don't feel limited by any of those suggestions. The most important thing is that you enjoy working on your hobby project. While the suggestions may help some people with that, they might not for others. They are just meant as a list of ideas you may find interesting.
Declaring a hobby project
It is a good idea to let anybody looking at your project know, that you work on it as a hobby. This helps you set the correct expectations. You can use the markdown snippet below to do so in your README.
> **Hobby Project**
>
> This is a [hobby project](https://hobby-project.dev). It is worked on recreationally, and its
> resources are limited. This may impact you. Follow the previous link to learn more.
Organisational Considerations
These are some organisational ideas you might want to take into account.
Clear Goals
Feature creep is very dangerous to hobby projects. They usually run on minimal resources already, and in that situation adding a couple of features here and there be the difference between a success and another abandoned idea.
As a counter measure you should set explicit and specific goals from the very start. Everything that isn't either itself a goal or part of one, is implicitly out of scope for the project.
This also applies to logical or trivial extensions. If you really want to, you can tackle them once the core project is complete. Until then, leave them be.
Extensive Documentation
There most likely will be significant periods in which you will barely work on your hobby project, if at all. In those times it is likely that you will forget a lot of the things you know about it. This knowledge often takes a lot of time to rediscover, and the process is often annoying, which might make you abandon your project.
You can prevent a lot of this by extensively documenting your project from the very start. It is tempting to think something like "I'll get to a first prototype, then document everything." There is a good chance you'll take a break right after the prototype, and then have no idea where to continue afterwards.
Some of the things you should document:
- The project goals
- The overall architecture you decided on
- How to build/run the program
- A list of ToDos and their completion status
- The purpose of modules, data types, functions, …. Use the doc comments of your language, if possible, so that an LSP can pick them up.
Automated Testing
Automated tests are very important for all software projects, be they hobby or professional. You might think yours is small enough to keep track of everything in your head, but you would be wrong.
Even if you do manage without tests for the start, once a couple months go by you will forget your earlier decisions. Worse yet, you'll make incorrect assumptions about them, leading to bugs.
Without automated tests it might take you quite some time to notice that there is a problem in the first place. If that happens, fixing it becomes even harder, because you not only will have to regain an understanding of the original code, but also the intentions behind your buggy change.
All of this is quite time-consuming and annoying, which might make you abbandon your project all together. To avoid that, it's much easier to take the time to write tests upfront.
Technical Considerations
Some technical things you might want to think about.Reduce Dependencies
Most modern programmings languages, like Rust, JavaScript and Go have widespread (or integrated) package managers, that make it easy to use a lot of libraries. This is great, especially when starting, because it means you can minimize the work you have to do.
However, this also has a significant downside. You need to keep your dependencies up to date, because otherwise you might run into problems. Depending on the type of project you are building, not doing so might also lead to severe security problems.
This is easy enough if you only rely on a handful of libraries. It becomes significantly more difficult once you depend on several hundreds of them. So you should keep an eye on your dependencies and carefully consider if the time saved by using a library is more significant than the maintenance this will take.
You might also want to consider vendoring your dependencies, instead of using a package manager. This means including the dependency code within your own source code, and shipping it as part of your application. Doing so makes adding new ones more difficult, and dissuades you from doing so excessively.
Simplified Development Environment
Some languages, like C# provide very large toolsets, like Visual Studio. Those can be very time-consuming and annoying to set up. If you get a new computer during your project, this might mean you abandon it, because you are not willing to spend that time just to set up the tools again.
To avoid this, you should prefer languages or toolsets that are quicker to set up. For example, setting up Rust is a quick and easy process using rustup. If you combine that with an editor like Helix you might be up and running on a new system in about five minutes.
Targetting Baseline (web only)
If your project is a website or web app, you should strive to use only features that are Baseline Widely available . This should mean that you don't run into problems where browser behave differently, or only some support a feature. This avoids the need for fallback implementations, as it is much less likely that any user will have a browser that isn't supported. This also makes it a lot easier to tell a user that they need to upgrade their browser, if a problem actually arises.
Inspirations
These are some of the things that inspired me to create this page:
- The Grug Brained Developer
- The Cult of Done Manifesto, and No Boilerplate's video on it.
- Several hobby projects I have abandoned in the past.