Sponsorship
AppSumo
Get up to $10K 💰 to list your digital product on AppSumo between now and November 17th.
AppSumo is giving away $1 million from their Black Friday marketing budget to digital product creators.
$1,000 bonus - to the first 400 products to go live
$250 bonus - to the next 2,000 products to go live
10 lucky entrepreneurs can win a $10K bonus!
Not subscribed to Console? Subscribe now to get a list of new open-source projects curated by an Amazon engineer in your email every week.
Already subscribed? Why not spread the word by forwarding Console to the best engineer you know?
Projects
miller
Miller is like awk, sed, cut, join, and sort for data formats such as CSV, TSV, tabular JSON and positionally-indexed.
language: C, stars: 4410, watchers: 63, forks: 119, issues: 100
last commit: September 23, 2021, first commit: May 03, 2015
social: https://twitter.com/__jo_ker__
gluetun
VPN client in a thin Docker container for multiple VPN providers, written in Go, and using OpenVPN or Wireguard, DNS over TLS, with a few proxy servers built-in.
language: Go, stars: 733, watchers: 16, forks: 82, issues: 48
last commit: September 25, 2021, first commit: February 06, 2018
social: https://github.com/qdm12
untab
UnTab is a browser extension that gives you superpowers by making it possible to search for keywords in all open tabs with just a few keystrokes.
language: JavaScript, stars: 139, watchers: 1, forks: 18, issues: 14
last commit: May 23, 2021, first commit: September 12, 2020
social: https://twitter.com/blenderskool
Console is powered by donations. We use your donations to grow the newsletter readership via advertisement. If you’d like to see the newsletter reach more people, or would just like to show your appreciation for the projects featured in the newsletter, please consider a donation 😊
An Interview With Quentin McGaw of Gluetun
Hey Quentin! Thanks for taking the time. Let’s start with your background. Where have you worked in the past, where are you from, how did you learn how to program, what languages or frameworks do you like?
I'm from Europe around France. I did a master in electronic engineering at Imperial College London, where I first grasped software with languages like C++ and Python, and then a master in computer science at New York University, where I learnt more concepts. I started to work on open source during my time at New York University. My involvement in open source really took off when I began hosting my own NAS and needed some programs that didn't exist. A significant part of my programming knowledge comes from open source development and reading through posts, blogs and Reddit. I worked as a backend engineer in Go for the most part in the last few years, my last job being in the ad-tech sector. I recently dropped React and Typescript for Flutter for any frontend projects, and I love using Go for anything which is not frontend.
Who or what are your biggest influences as a developer?
The Go way of thinking which made me a better developer across all other languages. Rob Pike described a few fun Go proverbs illustrating this thinking, with some applying to other languages: go-proverbs.github.io
What's an opinion you have that most people don't agree with?
I think that transferring our minds to a virtual world would be amazing, and that simulating our body and feelings would fill the gap between our current life and this virtual world. We would be able to think, grow and build things potentially a lot faster; have a much smaller carbon footprint; not worry about our physical health. Most people out there are attached to how it is now, don’t want to change, and even prefer to die. To me, this concept is just a different ‘encoding’, the data carried wouldn’t really change.
I wonder how you feel about Facebook’s “move” into the metaverse with this answer.
I don't think Mark Zuckerberg is aiming at such technology, which is, in my view, at least 100 years away. However, if Facebook (or similar) owns this technology, they should mathematically not be able to temper with your mind. I believe we will have new complementary technologies to secure it. We solved double spending starting with Bitcoin in 2008, I'm sure we can also have mechanisms and proofs that our virtual minds can't be tempered with by then. And maybe open source will play a role in there, if we still code things by then!
What’s your most controversial programming opinion?
It's fine to repeat code to be more explicit and improve readability. Go developers are a bit forced to do so due to the lack of generics for now, but I think this is better than using strange syntactic sugar to save a few lines of code and make it harder to read.
What is one app on your phone that you can’t live without that you think others should know about?
Mixplorer. It is the best file explorer ever. You can even run a local file server on your phone!
If you could teach every 12 year old in the world one thing, what would it be and why?
Financial and tax education. If a twelve-year old knows about triangles, he or she should know the basics of finance and of the taxation system, which both have quite an impact on one’s daily adult life.
If I gave you $10 million to invest in one thing right now, where would you put it?
I have a slightly complicated password manager idea in mind that I have been designing for a few years now, but I didn't code much of it yet. I would probably use the money to buy myself time to code and patent it, and then employ developers to help develop and maintain it.
If I gave you $100 million to invest in one thing right now, where would you put it?
This is rather a large sum to invest in one single thing! Provided I can keep a tiny percentage for myself to work on open source and live life nicely, I would aim at investing first to benefit everyone, not just myself. One such investment would be in companies developing the RISC-V CPU architecture, such as SiFive. I’m quite excited to replace amd64 and arm CPU architectures with Risc-v which should be more open and lead to better knowledge sharing in the long run.
What are you currently learning?
DNSSEC! I'm working on the v2 of qmcgaw/dns and the last complicated step is to implement DNSSEC validation for the DNS server I programmed. This should be used in Gluetun soon too!
What have you been listening to lately?
I listen to Changelog's Gotime every week to know about recent Go projects and software design.
How do you separate good project ideas from bad ones?
I don't separate them, but I order them by their usefulness and ease of development. Obviously, some will stay at the bottom of the list forever. I might also start a project - good or bad - because I feel like it, although this is rather rare.
Why was Gluetun started?
I bought myself a NAS with Docker back in 2018 and wanted an easy-to-use container to connect to my public VPN service provider Private Internet Access. I developed a simple shell script and a Dockerfile, and put it up on Github with the image on Docker Hub.
Where did the name for Gluetun come from?
It was initially named private-internet-access-docker, but was due a renaming since it supported more and more VPN providers. There was a discussion thread on Github about the renaming, and I ultimately decided that Gluetun would do. It comes from 'glue' and 'tun', which means glue things together to tunnel. Tun is also the kernel module name used for VPN tunneling. The only huge drawback I didn’t foresee is auto-correcting software changing it to gluten all. the. time. I even get gluten free products ads online now.
What was the biggest inspiration for Gluetun?
The inspiration came from the Github issues and support from the community. I did not have a need to improve it for quite a long time now from a personal standpoint. It's also the most complex piece of software I have touched so far and thus it is slightly addictive to develop and improve!
Are there any overarching goals of Gluetun that drive design or implementation?
One milestone is to make Gluetun a single static binary. It started as a bunch of subprocesses handled by a Shell entrypoint. I then rewrote the entrypoint in Go back in 2020. Since then I have been slowly replacing third party subprograms with pure Go implementations which can be cross compiled statically. Examples are tinyproxy replaced by my own Go HTTP proxy or shadowsocks-libev replaced by my own Go Shadowsocks server implementation. Wireguard was also added with its official Go implementation more recently, and I’m about to replace Unbound with my own DNS over TLS Go implementation as well.
What's the motivation for making Gluetun a single static binary? To make it easier for people to set up and use?
Essentially yes, with the aim to have a portable and cross platform Gluetun. And for the programming journey of course.
What trade-offs have been made in Gluetun as a consequence of the design goals?
Speed of development has been slowed down since I focus on Go-only implementations and cannot use existing programs from another language. For example, I will not add a SOCKS proxy binary to the Docker image and will instead code it myself, which takes more time.
What is the most challenging problem that’s been solved in Gluetun, so far?
One challenging aspect is to have all the VPN servers IP addresses bundled in the program. This was a design decision to prevent network traffic before connecting to the VPN server. Most VPN providers give out configuration files with hostnames, which unfortunately results in a DNS request sent from your real location, usually in plaintext. Any man in the middle such as your ISP, state or typical coffee shop hacker could block, modify and monitor the DNS request, resulting in potentially serious trouble. This is especially true since most users are still unaware of encrypted DNS. Multiple iterations were done to have this, such as manually coding them in Go source files. It’s now automated, all the data is written on a JSON file which is then embedded in the Go binary program, and the end user can update the IP addresses as well in case they become outdated.
Are there any competitors or projects similar to Gluetun?
There are several of them such as haugene/docker-transmission-openvpn or dperson/openvpn-client as well as some specific to certain VPN providers like thrnz/docker-wireguard-pia. Back in 2018, I wanted something simple to use for my provider, Private Internet Access (PIA) and I was having some fun toying with Docker and VPN. I also did not examine every existing possible solution that much. However, today, Gluetun is quite far ahead of every other project when it comes to tunneling through publicly known VPN servers with maximum security and privacy.
What was the most surprising thing you learned while working on Gluetun?
Go allows for a deep interaction with the Linux system without dependency. The TUN device is created by Go and syscalls, ip routes and rules are handled by Go code, there is even an official Wireguard implementation in Go. More recently I’m taking a peak at google/nftables to replace iptables and ip6tables calls to configure the firewall. I am glad I picked this language, although I did not know about all these advantages in early 2020 when I started rewriting the program.
What is your typical approach to debugging issues filed in the Gluetun repo?
From my perspective, there are three types of bug issues. The first one represents non-critical bug issues taking a long time to fix. These usually stay as such for multiple months. The second kind consists of critical issues which I can test and reproduce; I tend to fix these within a few hours. The last kind, which represents a good chunk of all the issues, are bug issues depending on the VPN provider servers. Unfortunately I cannot reproduce them since I am only subscribed to a single VPN provider. In this case, I usually need to ask the user to run commands and get their results back.
Maybe you could use the 10 million from the above question for multiple VPN subscriptions 😊
Well perhaps! Although I feel it's also nice to exchange with the user and get them involved in the resolution of the issue, especially since I'm usually fast at responding.
What is the release process like for Gluetun?
I make a release every 15 days approximately once the latest image has been proven stable for at least 3 days and without any issues recently created by users. This 3 days wait is actually quite nice for two reasons. Firstly, minor bug fix releases are rare ever since adopting this method. Secondly, I take this wait time as a 3 days vacation away from Gluetun, to work on other things, or nothing at all.
How are you planning to monetize Gluetun?
I'm working on a mobile app to control Gluetun and I would sell it for a few dollars. I trust the community would enjoy using it as well as spend a few dollars to support the development of Gluetun (and friends).
How do you balance your work on open-source with your day job and other responsibilities?
I code for my open source projects about 30 minutes in the morning before starting my day job, and about one to two hours in the evening. I would code on open-source about half of my week-end.
What is the best way for a new developer to contribute to Gluetun?
One should run the development container I have configured to set up your development environment for Gluetun. This is especially needed since Gluetun can only be developed on Linux for now, due to the tight integration with it. The contributor can then pick one of the Github issues, or start a Github discussion if guidelines are needed.
Where do you see the project heading next?
I need to make the Gluetun HTTP server API more robust in order to support interacting with graphical user interfaces. Because it’s self hosted, the API server version will be out of my hands. I am therefore planning on introducing a breaking v4 release with all the interface foundations for such API communication.
If I could also magically solve all the Github issues constantly hovering at a count of 40, that would be great!
What motivates you to continue contributing to Gluetun?
The complexity and uniqueness of the project, the many improvements that can be made and the community trying their best to be helpful.
Are there any other projects besides Gluetun that you’re working on?
I’m working on a Go implementation of a custom DNS over TLS and DNS over HTTPs serverwhich should also act as a stable Go library. I have another popular project qmcgaw/ddns-updater. Similarly to Gluetun, it supports multiple DNS providers and dynamically updates your IP address for us poor souls without a fixed IP address. More recently, I developed deunhealth, a tiny Go program using the official Docker Go API to restart unhealthy containers automatically.
Do you have any other project ideas that you haven’t started?
A simple HTTP server to count the number of hits on a page and return the current counter value as an SVG badge. I would like to use this for pages of my repositories on Github as well as on my blog to measure traffic in an anonymous and simple way. Integrating such a server with Prometheus and Grafana would also yield fun plots.
Where do you see software development heading next?
Trained algorithms such as Github Copilot will become more and more present in our daily development life, although they can also produce bad code which is something new we have to worry about.
On the frontend side, I believe we are finally making progress to have a single language/framework to support desktop, mobile and web altogether. One such language is Flutter. This is changing relatively fast.
I also expect backend languages to transition from older languages like C++ or Java to newer well established ones like Go or Rust. However, this transition seems to be much slower than with frontend and will likely take several years.
Where do you see open-source heading next?
Companies will definitely open increasingly more of their code to the public. This is especially true for security and/or infrastructure oriented projects, and this is beneficial to everyone.
Individual open source programmers will not grow in number much.
It’s rather unsustainable for individual programmers already. As an example, in my situation, I dedicated months of programming to Gluetun. This caused more and more users to use it and ask for new features, and I’m lagging behind more and more. Revenue wise, I appreciate every single donor out there, but the total donations amount to less than a week of professional work. The only way around is to develop code that can be used by enterprises which can support the project with more significant means. But even this is uncommon, where most companies will just use your code without supporting the project. Most developers I know do not work on open source since it costs time and stress and doesn’t generate revenue really. Maybe a reward system similar to Github Sponsor would change this dynamic, but I am not aware of any for now.
Do you have any suggestions for someone trying to make their first contribution to an open-source project?
Accept code criticism with a learning mindset. I personally love code contributions but I also tend to nitpick on a lot of things.