Category: Portfolio

  • Running Isolated Network Containers with NordVPN: A Privacy-First Approach

    Running Isolated Network Containers with NordVPN: A Privacy-First Approach

    In today’s digital landscape, privacy has become increasingly important. While many of us use VPNs on our personal devices, integrating VPN capabilities directly into containerized services offers a powerful and flexible approach to network isolation.

    Here’s how a simple Docker container with NordVPN can transform your self-hosted services.

    The Power of Isolated Networks

    When running services on your home server or Linux machine, those services typically share your home network’s IP address. This presents a few challenges:

    1. Privacy Exposure: All services inherit your home network’s digital footprint
    2. Network Isolation: Limited ability to route specific services through different network paths
    3. Fine-grained control: You can of course VPN the entire machine, but you may not want to do that.

    Using Docker containers with built-in VPN capabilities solves all three of these problems elegantly.

    Why Container-Level VPN Matters

    The real power of this approach is the separation of network concerns:

    • Your host machine maintains its original IP address and network settings
    • Individual containers can operate on completely different networks via VPN
    • Multiple containers can use different VPN connections simultaneously
    • Network traffic is isolated at the container level

    This architecture provides an exceptional level of control over your network topology without modifying your host machine’s configuration.

    The docker-nordvpn-transmission Project

    I recently published a project that demonstrates this concept perfectly: a Docker container that runs NordVPN with the Transmission BitTorrent client built-in. Everything works out of the box, you just need to pass it a token and a few config options.

    The magic happens through a few simple components:

    • A Dockerfile that builds an Ubuntu container with the NordVPN client and Transmission
    • A startup script that handles the VPN connection before any services start
    • Docker Compose configuration that provides the necessary container capabilities
    • Helper scripts to verify and change VPN connections on the fly

    With a single docker-compose up -d command, you get a container that:

    1. Establishes a secure NordVPN connection
    2. Starts Transmission with a web interface accessible on your local network
    3. Routes all Transmission traffic through the VPN
    4. Maintains its own unique IP address completely separate from your host

    Beyond Torrenting: A Pattern for Network Isolation

    While Transmission is included as a useful example, the real value is the pattern. This is kind of the most important part of the proof of concept for me.

    This same approach can be applied to:

    • Web scrapers that need to appear from different regions
    • Media servers accessing geo-restricted content
    • Development environments that need to test region-specific features
    • Security tools that benefit from network isolation
    • Any service where you want network separation from your home IP

    The Simplicity Is the Innovation

    What makes this approach powerful is its simplicity:

    services:
      vpn-container:
        build: .
        cap_add:
          - NET_ADMIN
        devices:
          - /dev/net/tun
        environment:
          NORDVPN_TOKEN: "your_token"
        # Mount your service config and data here
    

    With just these few lines in a Docker Compose file, you can create containers with completely isolated network stacks. The pattern is reusable across any service you want to isolate.

    Want to try this for yourself? The full project is available here:
    👉 https://github.com/rfaile313/docker-nordvpn-transmission

    You’ll need:

    • A NordVPN subscription and API token
    • Docker and Docker Compose installed
    • Basic familiarity with container concepts

    The repository includes everything needed to get started, including helpful scripts to check your container’s IP address and verify it differs from your host machine.

    Network isolation shouldn’t require complex networking setups or modifying your host machine’s configuration. With Docker containers and NordVPN, you can create isolated network environments for specific services with minimal setup.

    The real power is in the pattern itself — a foundation for building privacy-focused containerized services that operate on networks completely separated from your home infrastructure.

    Questions about this? Feel free to ask me 🙂

  • Global Game Jam 2021

    Global Game Jam 2021

    As I mentioned in my last post, I was able to hook up with a local team from The Greater Gaming Society of San Antonio and participate in this year’s Global Game Jam. Global Game Jam® (GGJ) is the world’s largest game creation event taking place around the globe. This year’s theme was “lost and found” and the team decided that a private investigation / noir type game would be fun. So my teammate Ansley spun up some art and Wes composed some music and we got to work. We ended up naming the game “Chase Ventura: Kid Detective” – a mystery game where you have to find clues as the neighborhood kid sleuth to “solve cases”.

    Animated title screen for "Chase Ventura: Kid Detective" - our team's submission for the Global Game Jam of 2021
    The game’s title screen

    Overall it was a super cool experience. I was lucky to have a great team; they produced super quality assets to work with and were great at communicating and providing feedback. I wish there had been more time to implement all of the ideas, there was just too much to do in such a short amount of time. I guess that’s the nature of game jams though. I also wrote the game’s systems from scratch and that detracted a lot of time as well. Unfortunately with four hours to go and tons to do, I had to strip virtually every idea out of the game to get something shipped, so you basically get a cut-scene, and then walk around the neighborhood and talk to the various characters Ansley created. Fortunately I feel like our team was on the same page and the game, the art, and the music fit well together. Here are some stills from the game:

    I put up a little time-lapse of the last four hours of the Jam condensed to 10 minutes (the deadline was at 5pm CST and I think I submitted at 4:56pm):

    I’m super thankful to my wife for being supportive as I basically spent 48 hours binging over code. Also a big thanks to John and his team over at the Greater Gaming Society of San Antonio for putting on the event and helping me get on a team to participate.

    If you haven’t ever done a game jam I think it’s a great exercise from a development perspective for a few reasons:

    • Even though I broke every programming best practice, from DRY to bad spaghetti code, the time constraints force you to move forward with the mistakes and take the least path of resistance at every turn, forcing you to write a lot more code and figure out problems quickly on the fly.
    • Letting your team dictate the idea and direction of the game takes you out of your comfort zone for games or projects you would normally make.
    • Reviewing your own code after the fact gives you an opportunity to review what you could have done to make the code better / more extensible if you had ideal conditions.

    While it was stressful, It’s also great fun in general. We also ended up taking second place out of our portion of the GGJ, and I am pretty happy about that 😀.

    Here’s the link to the Jam Page:

    https://globalgamejam.org/2021/games/chase-ventura-kid-detective-8

    And here’s a link to play the game online (recommended browser: Chrome)

    https://ggj2021.rudyfaile.com/

  • 2021: Complete projects, current projects, and beyond!

    2021: Complete projects, current projects, and beyond!

    It looks like it has been about 2 months since my last post 😬! November and December were crazy months for me in both my work and personal life. 2020 kept coming until the bitter end…

    When I wasn’t up to my eyebrows in work, I carved out some time to finally work on and complete the multiplayer board game I had been working on since September:

    Image of the Cavatars Thumbnail from GitHub

    Cavatars (Codenames with Avatars – clever I know) is a fully functioning multiplayer game playable in a web browser. I developed it in JavaScript using NodeJS, Socket.io, and Phaser3. The full source code is on GitHub:

    https://github.com/rfaile313/cavatars-game

    It’s not the greatest thing I’ve ever written but it plays like it was intended. What I was most surprised about when testing it with friends was how well the latency responded across multiple states. We had players in California, Texas, and Nevada with the server being located in San Francisco, and there was no visible lag:

    Cavatars’ maiden voyage 🚢

    Far more importantly though, the project allowed me to meet all of the goals I set when I started this project. All of the decisions I made when developing the game were for specific purposes:

    • Far greater proficiency in JavaScript, which I considered my weakest language at the time.
    • Better understanding of multiplayer gaming, client/server network architecture.
    • Learn Phaser3, a framework I have never used before.

    As one of my friends pointed out, there is no real purpose to the movement of the characters other than the fact it was to hone in on the movement for later projects down the road – which brings me into some of the stuff I have on the table for 2021.

    Building on the art kit I purchased and set of skills I developed to finish Cavatars, I have decided to start working on some other, longer term projects:

    1. Working on a Final Fantasy Tactics type game with my friend Travis. The game is yet to be named and we are in the very early stages. Travis brings a wealth of game knowledge and experience to the table and will handle most of the mechanics, balance, and lore. I will be handling all systems, programming, and development.
    2. Working on a longer term MMO passion project. These sprites and this art kit are perfect to put something like that together, so why not. There aren’t many 2D mmos that have come out in recent memory, so the idea of chipping away at one over the next few years seems exciting!
    3. Working on a smaller game to ship earlier, I’m thinking about a 1v1 multiplayer PVP arena type game.

    Aside from that, I reached out to The Greater Gaming Society of San Antonio which is a game development community in San Antonio that apparently has some folks participating in the upcoming Global Game Jam taking place this week, January 27-31. With any luck I’ll be able to connect with a team and follow up with a post about my experience 🙂

    Until next time…

  • Svelte is cool

    Svelte is cool

    I am always looking into other languages and frameworks for learning and new projects. I have been more interested in the web space lately after porting Draw! from C to web using Web Assembly, and have been curious how other tools in the space have been progressing as well.

    Not to begin a holy war, but I have never been a fan of React. Aside from the super-mega-corporation thing, I have never found it intuitive, easy, or fun to use. Angular? *laughs* 🤣. I have been seeing Vue seemingly becoming more popular as of late.

    So on Friday in the #developers Slack channel at work I asked a simple question:

    A very interesting discussion about frameworks and web development in general ensued. I love chatting about theory, opinions, and perspective on all things programming, and it was really cool to hear folks whom I consider some of the top developers in the industry contribute to the discussion.

    Along the way, two of my teammates brought up https://svelte.dev/. I had not seen it before, and the second I clicked the link I thought: “this is so cool!” I thought the syntax looked pretty straightforward, it looked intuitive, and I love the idea of less boilerplate *cough* react *cough* and no virtual DOM.

    While we talked about lots of other stuff during the discussion, I decided to spend part of my weekend refactoring one of my web apps – https://strong.rudyfaile.com – using Svelte. Previously this application was written in PHP (and I blogged a bit about it here.)

    I had been thinking about refactoring the program for some time, mainly because it doesn’t really need to make a request to the server after it loads since all of the data could be available on the front end, so sending a form -> POST request every time the program generated simply wasn’t ideal. So this application was a prime candidate for the work.

    Here was sort of how the old architecture worked. A full reload was required every time the user needed new information from the application:

    And here was the intention for the refactor:

    I found it surprisingly easy and straightforward to learn Svelte. I would honestly say there wasn’t even that much of a learning curve. I didn’t really watch a tutorial or dig too deep into it. I just checked out some of the examples and built a brand new project with npm and started hacking away, occasionally checking the Svelte docs to achieve a desired result.

    As much as I hate the bloatiness and general misuse and abuse of npm, it is pretty nice to start a project with a one-liner and have a live hot-reload development server up and running.

    so easy!

    Not too long later I had the entire app done and ready to replace the PHP app on the server. Building for production was trivial with npm run build – the kicker? The built files to be hosted on the web server were only .10Mb (100 kb!) larger than the previous files on the server!!

    Now that’s a bloat I can get behind! While I don’t think I’ll be npm install savemeplz for every single project in the future, I definitely will be using Svelte again sometime soon. Stay tuned 🤠!

  • Draw! is now Open Source

    Draw! is now Open Source

    Howdy everyone!

    After working on Draw! for a couple of months, then reaching the logical end of the purpose of making it (ship something using C and raylib) I have decided after publishing the game on the web last week, to open source the code on GitHub under the very permissive MIT License.

    The code lives here: https://github.com/rfaile313/draw_game
    You can play the game here: https://draw.rudyfaile.com/

    The code has always been on GitHub, but has lived in a private repository which is now public. The code itself isn’t the finest example of best practices programming or game development programming, but there is a single dependency (raylib) and I can say with confidence that I wrote every line of the code from scratch. There are also some live videos out there for most of the development process.

    I also wrote successful build scripts to four platforms: Windows, GNU/Linux, MacOS, and Web (HTML5/WASM). It’s never code I’ll look back on and think is great, but it *is* code that I’m proud to have written. It also served its purpose: make a small game from scratch in C programming, and learn and use raylib.

    Speaking of raylib, @raysan5 was just awarded an Epic Games MegaGrant:

    I couldn’t be more happy for @raysan5 and his project. He is a great developer, nice person, and is totally deserving of this awesome recognition!

    Back to the code. My hopes in making it open source is that folks learning C programming or raylib can have another source of reference for a working, published game. Perhaps someone will even fork the project and improve on it, isn’t open source amazing? 😁

    What’s next for me? Well, I have a few things on my plate at the moment. There are some work projects that are taking up the bulk of my time, but in addition to that, I plan on participating in Miziziziz‘s 48 hour game jam in four days. I was thinking about using Godot for the first time in this jam to learn it, but I also might use C and Raylib 😁. The concept of these jams that Miziziziz does is pretty cool: multiple game developers use the same art kit and have 48 hours to create a game with it. Here’s an example:

    Aside from that, I have been working to stay healthy and sane during these unprecedented times. Exercising a bit and trying to stay sharp and productive – I have also been playing a little bit of Starcraft2 and Hearthstone after a long, long break from gaming in general 😊.

    After the game jam, I was thinking about starting my next big project/game to chip away at for a long time. I have some ideas, and I’m thinking about an RPG/Roguelike as the general idea, but hopefully completely different than anything anyone’s seen before. I have some ideas 🤠.

  • Draw! is now playable

    Draw! is now playable

    I decided to port the game I have been working on when I have free time to the web so that anyone can check it out. It’s a simple wild west duel game inspired by Quick Draw from the original Kirby’s Adventure on NES.

    Anyone can play the game here:

    https://draw.rudyfaile.com

    If you want to check out a few videos of me working on the game (even the actual compiling for web!) check these out:

    Have fun!

  • Building an “easy” web application

    Building an “easy” web application

    I decided to spend my Fourth of July weekend transforming a small Python utility I wrote a couple of years ago for work. The idea was simple: make the tool more accessible for co-workers who use it by turning it into a web application.

    The premise of the tool is extremely simple. It automates the sending of multiple cURL requests to a WordPress site’s xmlrpc.php file with some extra QOL features.

    The purpose of automating the sending of multiple requests is that a single cURL request may succeed, but the WordPress mobile app and Jetpack do not make single requests – they make many requests and need to be in constant communication with that file. A single request might succeed, but many can fail due to rate limiting, bandwidth or other hosting limitations. It is impossible to fully diagnose a possible XML-RPC issue without performing a test like this.

    The utility works just fine, but I thought converting it to a web app would make it easier for folks to use. My first thought was to simply write a PHP script to make the POST request then return the results to the client. It probably would have taken all of 30 minutes but I thought “nah that’s too much work for a simple app….” So I thought I’ll just port the Python script into a web app using a Python web framework. Django is far too much for something like this, so I started looking at Flask. Even Flask seemed a bit overkill for a one-file project; thankfully there’s Bottle which is a “micro-framework” similar to Flask.

    I decided to spin up a Bottle app which is ridiculously easy and had a working version of the script running on a web page in about an hour.

    It worked just fine, but I wasn’t sure I liked the idea that the user would have to wait during the request for the script to complete all n number of requests before the results page loaded. I also thought that JavaScript might be a better solution in general: I could just make the requests via JavaScript and append the results to the DOM as they came in. I wouldn’t even need a server component. It would be so simple…

    The first thing I did was re-write the request using JavaScript’s Fetch API. This took a little while because I needed to refresh on Async Functions and Promises. I feel like every time I look at JavaScript it’s different 😭. After translating the request to a JavaScript acceptable request:

    let mySite = document.getElementById('siteURL');
        
        let myRequest = await fetch(mySite, {
            headers: {
                "Content-Type": "text/xml",
                "User-Agent": "Jetpack by WordPress.com",
            },
            body : '<?xml version="1.0"?><methodCall><methodName>demo.sayHello</methodName><params></params></methodCall>',
            method: "POST",
        });

    The next step was to wrap it into an Async function for looping:

    const MyAsyncFunc = async () => {
    event.preventDefault(); //don't reload the page
    }

    And then wrap the previous code into a loop and append the results to the DOM.

    const MyAsyncFunc = async () => {
    event.preventDefault(); //don't reload the page
    
      for (let i = 0; i < 50; i++){
        
        let mySite = document.getElementById('siteURL');
        
        let myRequest = await fetch(mySite, {
            headers: {
                "Content-Type": "text/xml",
                "User-Agent": "Jetpack by WordPress.com",
            },
            body : "<?xml version=1.0?><methodCall><methodName>demo.sayHello</methodName><params></params></methodCall>",
            method: "POST",
        });
    
        //console.log("Request #" + i + "HTTP Response: " + myRequest.status + " " + myRequest.statusText);
    
        document.getElementById("results").innerHTML += `<div>${"Request # " + (i + 1) + " | HTTP Response: " + myRequest.status + " " + myRequest.statusText}</div>`;
        }
    }

    This worked GREAT except:

    The request was coming from a different origin than the server, so it was blocked by CORS which is a security feature imposed by all modern browsers. From the wiki:

    Cross-origin resource sharing (CORS) is a mechanism that allows restricted resources on a web page to be requested from another domain outside the domain from which the first resource was served.

    A web page may freely embed cross-origin images, stylesheets, scripts, iframes, and videos. Certain “cross-domain” requests, notably Ajax requests, are forbidden by default by the same-origin security policy. CORS defines a way in which a browser and server can interact to determine whether it is safe to allow the cross-origin request. It allows for more freedom and functionality than purely same-origin requests, but is more secure than simply allowing all cross-origin requests.

    Cross-origin resource sharing

    Shit. I was never going to be able to be in control of the server from which the client request originated, since this tool in essence needs to be able to query any WordPress site. I understand the security implementations, but was kind of frustrated. I could get exactly what I needed in one cURL request, now I had to find a way to work around this. After some discussion on the Handmade Network, I confirmed that the request could be made from node or another tool on the server where CORS doesn’t exist for the request to the target WordPress site, and I would control the CORS between the client and the server.

    This quickly became more complicated than it needed to be. I could have just run the information through the back end and load it into a new route but that would be just like the Python solution. The idea was to run the request async and append the results to the DOM.

    Of course, the actual request would look something like this:

    Except it’s even more complicated because you can’t just pass something to the server like that and get it back asynchronously…. you have to set up an API! So I set up a small REST API to receive a GET request appended to the URL as the URL. Then sent that URL off in a fetch request, then sent the promise back to the client as the response data:

    app.get("/:url", (req, res, next) => {
        var recievedURL = req.params.url;
        console.log("Got URL: " + recievedURL);
        fetch(recievedURL, {
            headers: {
                "Content-Type": "text/xml",
                "User-Agent": "Jetpack by WordPress.com",
            },
            body : '<?xml version="1.0"?><methodCall><methodName>demo.sayHello</methodName><params></params></methodCall>',
            method: "POST",
            mode: "cors"
        }).then(data => res.send(data));
        console.log("Sent Data");
    });

    Yeah, it was messy as shit. It was also getting harder and harder to debug as JavaScript has no timeout functionality I would have had to wrap that request in another promise. It was all just so needlessly complicated and frustrating. I kept going back to my command line and running that single cURL request, getting exactly what I needed, and getting pissed.

    Ultimately I decided that the node app + REST API was just more trouble than it was worth. Two packages installed and I had a bloaty node_modules directory with 73 folders and 335 files.

    I hate node.

    Ultimately I said “screw it” and decided the whole API approach for this one-page app was WAY more trouble than it was worth. I would have had to maintain the client, server, and node packages because you know those things have to be updated every 9 minutes or you have a security vulnerability 🙄.

    So, 72 hours later and I was back to where I started, with my simple yet effective one file bottle app. The source is 6kb and can handle what it needs to, the error logging is verbose and it works how I expect it to. The tradeoff? People have to wait 1-30 seconds for the request to complete or timeout, so I added a GIF to help them with the wait:

    Three days wasted. I should have just written the PHP script 😢.

    My friend & co-worker Brooke helped put some simple styling on it (also helped with my workout program design) and I think the final result looks pretty sleek:

    I also got to do all of the fun systems stuff like remember how Apache works, update certbot from ACME v1, and play with the virtual hosts file which is always a good time.

    I spent some serious time on input sanitation and error catching, so it should be interesting to see how people break it 🙂

  • Free game assets

    While working on DRAW! I decided to commission a few artists on Fiverr to create the art assets. My idea was to commission about ~5 different artists and choose my favorite as art for the game. After about a week I decided to use assets from the very talented @penzilladraws who is an incredible Danish artist and was very easy to work with. While I ended up using this art in the game and won’t be directly sharing the assets here, I encourage you to check out their work on Fiverr and other places. Here is a screenshot of what the assets look like put together in my game:

    The other four artists made great work as well, but I didn’t end up using it in the final project. I have never been a fan of mixed and matched assets, but I also don’t want to leave this hard work sitting on my desktop in a folder called “Fiverr stuff I’m never going to use” so I have decided to share the art here for anyone to use 😊.

    1) @surajrenuka

    Examples:

    Individual Background Assets:

    Character Sprite Sheets:

    GIFs of the character sprites:

    2) @diegorago138

    Example:

    Background Assets:

    Sprite Sheet:

    GIFs:

    3) @dara90

    Example:

    Sprite Sheet:

    GIFs:

    4) @heart_container

    The only asset is a single sprite sheet:

    I hope you enjoy and check out these awesome artists on Fiverr and other places.

  • The Krimm

    With 2020 leaving me unsure if the Mayans were off by eight years, I have been doing whatever I can to stay busy. Aside from pouring myself into work, I have been working on my small game Draw! and tackling my project backlog.

    One of the things my wife used to subscribe to was something called “The Skimm”. The Skimm was basically an aggregation of news that would get emailed to you every day. She really liked it, but I thought I could make something better for her. This was in 2015 so in true husband fashion, I took care of it in 2020.

    Introducing, the Krimm

    The Krimm (Kristen + Rudy Skimm) is similar to the Skimm, except heavily customized to my wife’s liking. Every morning at 8:30am, she gets an email with the top three news stories in each category she’s interested in, which includes a summary and a link to the full story. What I like in particular is the sources tend to be diversified, and the lack of images allows me to fit more information on the screen and her to be more objective as she’s choosing which stories look interesting hopefully based on substance rather than imagery.

    How does it work?

    It’s very simple. All I did was SSH into one of my servers and install Jarun’s “googler” utility which I use often and highly recommend. One of the flags on the library is to pull results from news sources only. Perfect.

    From there, I made two simple bash scripts. One to run the utility for what she wants:

    simplicity scales

    and a one-liner to send the content of the generated text file to our emails with the subject “Today’s Krimm! 2020-06-01” (or whatever the date is 🙂) using postfix.

    So, pretty simple. From there I set up a simple cron to run the make_file script at 8:29am at our local time in the system’s time and then I fire off the postfix email script at 8:30am.

    So now, every day at 8:30am my wife gets a customized news feed from Google news consisting of the top 3 stories in the world from different sources based on keywords she’s interested in:

    That’s it?

    That’s it. It took me about an hour start to finish to hack this together, and she is satisfied with the result. I subscribed myself as well because well, hey, it’s pretty useful!

    What else have you been doing?

    Trying to stay sane. I have a really nice post in the works that I’ve been meaning to make about an enlightening conversation I had with one of my co-workers at Automattic. In the meantime, I also had the pleasure of interviewing the lead of the Handmade Network on their podcast:

    Which was very insightful and a lot of fun! Highly recommend the Handmade Network as always. Catch my post on Handmade here.

  • A commitment to Handmade

    A commitment to Handmade

    This tale begins as most of the major changes in my life do during a sleepless night. It was about 3 in the morning and I was browsing YouTube videos in bed when I stumbled upon what is possibly the best dev log I’ve ever seen:


    When professor rework showed up I just about lost it 🤣

    I was laying there in disbelief between fits of laughter at what this guy was doing. Two years Thomas Randall has been working on this game. He started in Unreal Engine, Rewrote in C++, and then finally in pure C. He did everything over this period of time from completely redesigning the game’s architecture to teaching himself physics on the fly. He also moved his entire game into a new engine in a week.

    Aside from the awesome flow and humor in the videos themselves (something about Aussie sarcasm is extra funny 😀) what really intrigued me was Randall’s commitment to his vision. As a programmer and game developer, I have settled time and time again like everyone else for various reasons: burnout, time constraints, money, external factors, you name it. Randall wasn’t willing to give an inch. He wants to make the game he sees in his mind and obviously doesn’t care about what it’s going to take to get there.

    That kind of passion is contagious. As I watched more of Randall’s videos I started getting introduced to some other folks in Randall’s network via the videos. One of these guys is a fellow by the name of Ryan Fleury. Ryan developed the Telescope game engine Randall’s game currently lives in, and also created a custom tool called Data Desk for building and parsing C-like data components.

    Ryan uses Data Desk in most of his software projects and I was blown away at the level of fidelity he was able to achieve in a 48 hour game jam with a limited 2d sprite sheet. It is seriously impressive. Highly recommend watching the first five minutes of the Jam:


    This got me interested in what Ryan was working on and I came across his project “The Melodist” and again was simply blown away by the general difference in quality and attention to performance and optimization that was going into this project. I’ve made a few games, and a lot of software. I’ve played a lot of games and used a lot of software. This was next level stuff.

    I reached out to Ryan to introduce myself and ask if he would be interested in “micro-mentoring” me. Ryan is kind of busy 🙂, but was kind enough to invite me to the Handmade Network.

    The reception I have received since joining the Handmade Network community has been incredible. Handmade Network lacks the elitism or snobbishness I’ve seen in some development circles. Veterans of the community answer day 1 questions from new members or guests with the same respect and enthusiasm that they treat each other with. It’s kind of interesting because you would think folks that are doing things purposefully harder and putting invisible restrictions on themselves would feel a certain superiority. The opposite couldn’t be more true.

    It was through this Network I started meeting other folks working on extremely interesting software with a high attention to detail on performance, customization, and portability.

    This is something I’ve been curious about for years:

    I’ve been programming for 15 years now. Recently, our industry’s lack of care for efficiency, simplicity, and excellence started really getting to me, to the point of me getting depressed by my own career and IT in general.

    Modern cars work, let’s say for the sake of argument, at 98% of what’s physically possible with the current engine design. Modern buildings use just enough material to fulfill their function and stay safe under the given conditions. All planes converged to the optimal size/form/load and basically look the same.

    Only in software, it’s fine if a program runs at 1% or even 0.01% of the possible performance. Everybody just seems to be ok with it. People are often even proud about how inefficient it is, as in “why should we worry, computers are fast enough”

    – Nikita Prokopov on Software Disenchantment

    This is especially true in Web where the landscape changes drastically and tempo can be unpredictable. One moment you’re living in a dollar sign world $ in jQuery and the next it’s all about React. One minute your project has 5 folders and the next you have thousands of node modules and GitHub is overloading mail servers sending you dependency security notifications every 5 seconds. It is madness.

    All of this culminated in a few personal commitments. I have made a commitment to begin on the path of “getting closer to the metal” by developing new projects in lower level languages (particularly C) and committing myself to a greater understanding of how things actually work. Decades of abstraction and seemingly infinite storage space and processing speeds have led us here. I have also decided to participate where possible to the Handmade Network, contribute, and give back where possible. For example, one of the members: Allen Webster achieved what many programmers aspire to do: built his own editor called “4coder”. 4coder is exactly the type and quality of software that has me so intrigued with the Handmade community. There’s even a Handmade Network Podcast (it’s excellent btw) where some of these folks discuss their motivations for these projects and problems they solved along the way.

    Through Handmade Network I have found all sorts of high quality developers and projects. Among these was a library called “Raylib” written by a guy named Ray from Barcelona, Spain. I was so impressed by the quality of Ray’s library (he has a whole suite of libraries, actually) and the levels at which he was willing to go to share his work. Aside from being under an extremely generous software license, Ray has worked tirelessly to ensure his software can be used at every level, on every platform, with virtually any utility.

    I was once again moved by the passion I saw coming through in Ray’s project. Ray also actively communicates with folks interested in using his software and is extremely kind and open to working towards anything that will help someone have an easier time. It is for this reason that Ray is one of the solo developers I decided to donate to during this time of COVID-19 uncertainty:

    Speaking of Raylib, the Raylib community recently held a 32×32 pixel game jam I decided to whip up a submission in about two days and enter! I found the constraints interesting: how cool can you make a game that has to fit in a 32×32 grid of individual “LED” and be 100% generated programmatically with zero external libraries outside of Raylib? Turns out, pretty cool:

    Flappy Box – my Raylib game Jam submission programmed in C

    While the game isn’t extremely graphically pleasing, it plays well and the entire executable program is 15kb!! For reference, the above GIF is 52 times larger than the game it’s displaying.

    You can check out the source code (or grab the executable and play) here:

    https://github.com/rfaile313/RayLib32x32GameJam

    One of the cool things about making something like this is it could be easily transitioned into a hardware project. For example, very little would need to be changed to port this game onto a bookshelf, sort of like what this guy did with Tetris:

    😎

    I also plan on utilizing Ray’s suite of tools and other Handmade Network community projects and affiliations in my quest to create better software. In the meantime I will also be giving back to the community in other ways. For example, here’s a quick tutorial on creating your first project in 4coder on Windows:


    The best way to help out Handmade Network and other Handmade projects is through the Handmade Fund. Other developers like Randall and Ray usually have other ways to give back if you like what they’re doing.

    I’d like to encourage anyone who feels like donating during this time to consider folks who are making amazing open source software. If you don’t feel like donating, consider giving back by sharing links to the software, authors, and community. They deserve it.