The whys, the hows & the goals of NetIP
A master plan if you will.
Today, I finally released my first open source project: NetIP. You can read the announcement post here.
In this blog post, I'm going to lay out the whys, the hows, and my goals that represent this project in my open source endeavor. Strap in: it's a bit long and rambling, but I swear I'm going somewhere with all this.
The Whys
Story Time!
I'm a programmer. Which means that when I have a software idea, I can open my favorite IDE and start building it from the ground up.
The majority of these ideas are for small repetitive personal tasks that I want to automate because I'm lazy. And while they help me in my workflow and perpetual learning process of new langages/technologies, these don't really need to see the light of day because they are only useful to me.
However, I also have ideas for projects that can be useful to others. They all started with the same common objective: to fix a personal itch in my daily life. Existing software couldn't fit my use case, so I decided to create my own alternatives, with a big focus on the UI/UX to make them just the way I want to use them on a daily basis. And since I've been a long time admirer of the open source community, I decided to open source them.
Now, without further ado, let's talk about these projects.
Project 1 - A self-hosted music app
I've been listening to music every day for as long as I can remember, whether I'm programming, commuting, working out, or just whenever I have the chance to listen to my favorite artists or songs.
In the early days, I used a USB thumb stick MP3 player with just 128MB of storage. Then I upgraded to a 4GB Sony Walkman MP4 player, which felt like a huge leap in storage capacity at the time. During high school, I transitioned to a 64GB iPod Touch, once again significantly expanding my music collection. Then, around 2015, I started enjoying high-resolution music, playing FLAC files on dedicated DAPs like the FiiO X5, FiiO X5 III, and now the Hiby R4. Since then, my music library has grown significantly, and I proudly consider myself part of the music hoarder community.
Now, these devices are great in their respective time, but they all share the same issue: synchronizing and tagging files properly. I do enjoy the process of carefully curating new artists/albums into my library, but properly maintaining several thousand files is a challenging task that doesn't scale well. And same goes for copying these songs from my NAS to my devices.
All of this is quite tedious, even with the tools that the music hoarders community praises on a daily basis. I get why most people just get a Spotify/Deezer/you name it subscription : they get a clean & organized library ready to be played. All of this for a monthly fee that increases every year, and the loss of their music library actual ownership. Just like privacy, data ownership is an issue we see growing every year. This is one of the reason music hoarder exists: we want to own our music library forever. But this also means we must properly maintain them over time.
So what can we do? What tools do we have?
When I got into programming, one of my teachers showed me Subsonic. I instantly fell in love with the app. Being able to stream my music library anywhere I want, and synchronize all my devices at once was a true blessing. Its metadata editing capabilities were limited, but functional.
However, long story short, the developer who created Subsonic decided to close its sources since version 6.0. The community replied by creating forks (Airsonic and Airsonic Advanced being the most popular) which development seems to have stalled at the time of writing. There's also other great self-hosted projects such as Navidrome, koel or LMS. I've tried them all and while they're great, I always found myself frustrated by:
- their UX/UI
- their limited metadata editing/curating features
- their lack of support for multiple releases of albums (like Discogs does)
- their streaming stability issues, especially with FLAC files.
To be clear: I'm not complaining. These projects are awesome, and I can only be thankful to all the developers that devoted years of work on them. But I needed more, my music library needed more.
Considering all of this, I decided to create on my own ideal music app. Now, while this project is the most important to me (if you can't tell already, I'm very passionate about this subject!), it's also very ambitious. I have tons of ideas to implement for this app that I can't list here because it would make this post even longer. But I'll tell you this much:
- it would be free & open source (most likely AGPLv3), without any paywalled features. Kinda like what Immich does, but for music.
- it would be a spiritual successor of Subsonic, with a modern UI like Spotify (but without all the nonsense that Spotify rolls out every month).
- the metadata would be handled like Discogs does. Because it's the only viable way (don't @ me).
- it would be coded in C#/.NET.
- the project would be divided in two codebases: a self-hosted server and a cross-platform client.
Needless to say, I soon realized that it would require me way too much time & work before even releasing a pre-alpha of this project. I did a lot of research/prototyping for a few months, notably discovered Uno Platform (which is awesome by the way), but eventually the project stalled.
Project 2 - An email client/productivity app
Meanwhile, I found myself increasingly frustrated by the UI of Thunderbird. I use it for all my emails account: personal, work, throwaway/spam. I find the UI not very good for handling multiple inbox (and to be fair, very few email clients do it well imo). Same thing with the Calendar and Contact modules : they certainly don't lack the features, but the UI leaves something to be desired.
Again, I can't stress this enough: Thunderbird is an amazing software. And the dev team behind it did a great work with the Supernova redesign. But I couldn't resist the urge to create my own email client (I will get back to that urge later).
However, this time, it would be different from project 1, because it was "only" a cross-platform client using Uno Platform. No server to code, less work to do! Right?
So where is it? Well, you probably guessed it... It's far from done. But I did get something :
So yeah, a fairly basic UI was done, a rudimentary IMAP support is in place, the emails can be displayed as a threaded conversation like Gmail does (side note: this is very hard to pull off, no wonder almost only Gmail does it right), there's a whole settings menu, and I even got a Tasks module done!
But all in all, it's nowhere near a shippable state. The mobile version is broken, most functions still need tons of work and/or are placeholders. In other words : far from done.
The elephant in the room
By this point, you may think that I have an issue with finishing what I've started. And you'd be 1000% correct. I am a perfectionist, which is a blessing and a curse.
It's a blessing because it means I care about the smallest detail when working on the software that I love and need. But it's also a curse because I can find an unlimited amount of things to work on to postpone the release, especially when working on the UI.
And to add insult to injury, I'm a certified procrastinator with impostor syndrome.
I struggle a lot with these issues every day, which is far from ideal when you're attempting to release something publicly. I've tried a lot of things to mitigate these issues: todo lists (which is ironic when you're working on a software with a ToDo/Tasks module), hard deadlines, divide big tasks into smaller ones, etc. But even so, it remains a struggle. Which brings me to the project 3...
Project 3 - NetIP
Still reading so far? Alright, let's *finally* talk about NetIP.
During the last summer, I found myself needing my local/public IPs several times a day. What I did was either open a Firefox tab > Google "My ip" or Windows + X > PowerShell > and type ipconfig
and grab what I needed. And to be fair, that's fine if you do it once a day.
But once you do it 5+ times a day like I did, it becomes wearisome quite fast. I searched for apps that would do just that, but I couldn't find any. So one morning I opened Visual Studio, started a new project and made a small WPF popup app that can be accessed from the Taskbar. Within an hour or two, the popup was working, and I was using it for my work.
And then it hit me: this project is useful to anyone working in IT, it's small and it can be open sourced. In other words, it ticks all the boxes for a good first release for the procrastinator/perfectionist that I am.
So I decided to release NetIP as my first open source project. It may not be perfect, but at least I'm releasing something and generating momentum from which I can work with on the other projects.
The Hows
Not just the source code
Now I could have just pushed the code on a public repo, throw a license, write a README.md and call it a day. After all, NetIP is a very small project that shouldn't need more than that.
However, I actually want to take the opportunity of NetIP's release to try an open source model that I will then apply for projects 1 & 2.
Therefore, in addition to the source repo, I'm also creating a community forum, a documentation website and a website for the project. I'm obviously not reinventing the wheel here, but I've detailed below some requirements for each of them.
One thing I want to make abundantly clear: a lot of excellent projects don't do that, and that's 100% okay. Not everyone has the time and/or energy to do all this extra work, especially for a small open source project. I'm in no position to judge anyone whom was generous enough to release open source code, nor do I even want to! I'm just sharing my experience on how I went the extra mile for this project so it can inspire you to do the same for yours. Beside, I'm sure this model is far from perfect and I'll need to refine it as time goes by.
I - Community Forum
URL: forum.aigl0n.net
That's right, I'm opening an Internet forum. In 2024.
Communication is a critical & permanent issue for any project. It is therefore very important to choose the correct tool that will be used by the community, because changing it later is very annoying for everyone involved.
Most open source communities use Discord, I get why and certainly can't blame them. It's way simpler & quicker to setup, there are tons of cool features and most importantly: joining a server is almost frictionless because everyone and their dog uses Discord.
However, as it has been said many, many, many times : Discord is far from perfect. In my case, I mostly care about 4 things:
- asynchronous communication
- powerful searchability
- unified place to track everything related to the projects I work on (feedback/bugs/features)
- decentralization
With this in mind, a Discourse forum is pretty much the go-to solution for projects like mine, so I went with that.
I activated Discord and Github Oauth Login to facilitate the registration of new members. I don't expect a lot of users (at least at the beginning), but I'm confident it's the way to go for the long run.
II - Documentation
URL: doc.netip.dev
For the documentation, I went with Material for MkDocs, which works great to create a unified documentation website from Markdown files. 08.11.2024 Update: I changed it to Docusaurus, read about it here!
The documentation is divided in two main categories: the User Guide and the Contributor Manual.
One important thing that I wanted to do from the beginning is write how the codebase of NetIP is structured. This dramatically helps new contributors to understand how the software works (but also me when I read code I wrote ages ago), which I think is very important for any open source project.
To achieve that, I used the C4Model. It's a set of rules to help visualize software architecture at different levels (System Context, Containers, Components and Code). You can see it in action here.
A documentation being a documentation, it's never complete and requires discipline from the developers to maintain it along the codebase. NetIP's documentation is far from done, but a fair chunk is already available, and its current structure should facilitate future updates.
III - Website
URL: netip.dev
This is a tricky one. I'll be honest: I don't really enjoy creating landing websites : it gets time-consuming quite fast. However, I do actually need one from the start for the open source model I try to accomplish. I needed 3 things:
- static
- fast
- an integration with my Ghost blog so that I can unify my blog posts from the same place.
There's a crapload of framework out there, I went with Astro because it was the most convenient to work with using an existing template. The posts of my blog are pulled and added at netip.dev/blog. They then redirect to this blog to avoid generating more pages on the landing website. It's lazy, but it works.
I spent more time than I would like to admit on this website, but again, I do believe it's better to have it now rather than later.
The Goals
So, what's next?
With all of this said, one question remains: what's next?
Well first, now that NetIP is out, people (you, yes, you!) will hopefully start using it and provide me feedback. I'm not gonna lie: it's terrifying. Having no idea how many people are going to use my software and how they're going to react to all of this is terrifying. But I have to accept it, otherwise I won't release anything.
As mentioned in the launch post, I'll continue to work on NetIP in the upcoming weeks/months. I have a few bugs and features that I want to do. I also have to work on the localization and open source the documentation. Plenty of things to do!
Then, depending on the community feedback & usage I get from NetIP, I'll get back to project 2 and its release.
There's also the music app! I've learned a lot after years of tinkering with UIs, .NET, APIs & Docker. I feel way more confident now compared to a few years back. However, I still need to prototype a lot for this project. I've gone back to it here and there recently, doing a lot of tracer bullet code to grasp the ways I should craft it. The path from music files in a NAS folder
> Docker Server API
> Crossplatform Client
> Android MediaSession Notification
is quite long...
I intend to go back to this project as soon as possible, I just don't know when yet.
Contribute
If you want to help, please visit the Contribute page for more details. There's also the Donate page if you want to support my work.
Any help is appreciated! Thank you!
Closing words
And that's my "master plan" for the 3 mad lads who read all of this nonsense!
One would think that it's way too much work for a single developer. And I agree, it's a lot of work. But it's actually one of the reason that I want these projects to be open source : By all means, I can't pretend to know everything and I need a community to help me build these projects.
It will take time, I will most certainly make mistakes along the way, it could even backfire on me in a few years or even less. Who knows, we shall see! ¯\_(ツ)_/¯
But you know the quote: good things take time. This blog post and this release took a really long time and are a major step for me. I'm glad it's finally published! I can't wait to build these software and release them on the Internet.
Now back to work!