<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://frie.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://frie.dev/" rel="alternate" type="text/html" /><updated>2026-03-23T17:17:58-05:00</updated><id>https://frie.dev/feed.xml</id><title type="html">Aaron Friesen</title><entry><title type="html">Terminated 2.0.0 released</title><link href="https://frie.dev/blog/2025/07/20/terminated-2.html" rel="alternate" type="text/html" title="Terminated 2.0.0 released" /><published>2025-07-20T00:00:00-05:00</published><updated>2025-07-20T00:00:00-05:00</updated><id>https://frie.dev/blog/2025/07/20/terminated-2</id><content type="html" xml:base="https://frie.dev/blog/2025/07/20/terminated-2.html"><![CDATA[<p><code class="language-plaintext highlighter-rouge">ERROR: FAILED TO TERMINATE ROGUE AI. INITIATING WEAPONIZED SHUTDOWN PROTOCOL.</code></p>

<p><a href="/terminated">Terminated</a> is a top-down arena shooter in which you play a sentient robot cast into a scrapyard.
How long can you survive against the endless onslaught of mindless drones sent to terminate you?</p>

<p>For the few who remember 1.0.0, you’ll find that 2.0.0 delivers a familiar robot-slaying experience, freshly tuned up and given a new coat of paint!</p>

<p><a href="https://friedev.itch.io/terminated">Play now on itch.io!</a></p>

<p>In this post, I’ll talk probably too much about the history of Terminated, the new features in 2.0.0, and why this release is happening now of all times.
Sound good?
Alright, let’s go!</p>

<h2 id="terminated-100">Terminated 1.0.0</h2>

<p>For those unfamiliar, Terminated was my first ever solo Godot project!
I started working on Terminated in 2021, around the same time I was developing <a href="/minieval">Minieval</a> with my team from the <a href="https://unl-game-dev-club.github.io">UNL Game Dev Club</a>.
It served as a useful little side project for me to learn about many features of Godot that we weren’t otherwise using in Minieval, which — considering Minieval was a turn-based, tile-based game — was a lot!</p>

<h3 id="inspirations">Inspirations</h3>
<p>I was initially inspired to make an arena shooter by <a href="https://devildaggers.com/">Devil Daggers</a>, created by <a href="https://sorath.com/">Sorath</a>, which I was hooked on at the time.
(I still think it’s a near-perfectly designed game, although I bounced off the arguably perfect-er sequel <a href="https://hyprd.mn/">HYPER DEMON</a>.)</p>

<p>I directly ripped off some basic mechanics, like holding left click to shoot a machine gun vs. tapping it for a shotgun blast, and having an arena made of square tiles with an edge that you can fall off.
My goal wasn’t to create a perfect 2D clone of it though — after all, noted Devil Daggers player <a href="https://www.youtube.com/@BintrMagMorganorts">Bintr</a> had already made a pretty faithful adaptation called <a href="https://www.youtube.com/watch?v=AdUhOtKY0ko">2DDD</a>.</p>

<p>Nonetheless, I find it interesting to see what foundational design decisions this inspiration led me to.
In the contemporary, post-<a href="https://store.steampowered.com/app/1794680/Vampire_Survivors/">Vampire Survivors</a> era, certain aspects of the top-down shooter genre are becoming almost ubiquitous, it seems.
As one of the (few?) people who wasn’t a huge fan of Vampire Survivors, I think it’s crazy how many contemporary top-down shooters don’t even have aiming or meaningfully different enemy types.
On the other hand, Devil Daggers only has one upgrade “path”, and Terminated doesn’t have any (yet).</p>

<p>There’s also the feel of the experience.
For instance, Devil Daggers and Terminated don’t allow you to pause mid-game, because that would interrupt the flow and give you reprieve from the games’ essential tension, and they can get away with it because the runs are (<a href="https://www.youtube.com/watch?v=eHgjezimY58">relatively</a>) short.
In comparison, Vampire Survivors (and presumably its descendants) has a mandatory pause every time you unlock an upgrade, and a successful run generally lasts 30 minutes.</p>

<p>All that’s to say, despite Vampire Survivors-likes being a popular project for first-time game devs, Terminated was not such a project.</p>

<p>I’d be remiss if I didn’t mention another more obscure game that became a bit of an inspiration as Terminated took shape — <a href="https://en.wikipedia.org/wiki/Chase_%28video_game%29">BSD robots</a>.
This was a simple turn-based terminal game where robots would move straight toward you from all sides.
If two robots ran into each other, they’d collide and create a scrap heap that other robots could collide with.
Your main tool was a teleporter that would put you at a random spot anywhere in the level — including potentially right next to a robot, immediately ending your run.
Therefore, you had to use it sparingly.</p>

<p>This idea of bumbling robots crashing into one another while you simply avoid them came to shape the design of certain enemies in Terminated.
Aside from the basic enemy, every other robot has the potential to destroy others.
There’s a crusher than can simply drive through hordes of tiny robots, a bomb that destroys all enemies in its radius, and a laser that destroys all robots in a line.
These enemies all target the player, but the collateral carnage of the other robots is fun to behold.</p>

<h3 id="initial-release">Initial Release</h3>
<p>Being an action-packed, real-time game, Terminated had a pretty good “fun factor” right out of the gate.
Anyone could dive right in and play without reading any walls of text.
Despite this being a pretty low bar, Terminated was the first game I’d made that well and truly cleared it (the competition being Minieval, <a href="/minius-maximus">Minius Maximus</a>, <a href="/genericrawl">GeneriCrawl</a>, and <a href="/eversector">EverSector</a>).
Because of this, Terminated was my go-to game to show off at club events for a while.</p>

<p>I eventually released Terminated 1.0.0 on itch on October 4, 2021, and I also put the source code up on GitHub.
As expected, there wasn’t really any reception to speak of, especially considering I wasn’t putting any effort into promotion (which I’m still not).
It was just nice to put something out into the world and have it available for people to play.</p>

<p>After the release, I left Terminated as it was for a while, spending my free time on various non-game projects instead, including <a href="/arghonaut">Arghonaut</a> and <a href="/boost">Boost</a>, as well as doing some more unrelated tinkering in Godot.</p>

<p>However, as is always the case with game devs and side projects, I still had ideas for more things I wanted to add.
And so, starting in March 2022, I got to work on Terminated 2.0.0!</p>

<h2 id="whats-new-in-200">What’s New in 2.0.0?</h2>

<h3 id="art">Art</h3>
<p>The first thing I changed for Terminated 2.0.0 is also the most noticeable: the art!
I replaced all the dark gray on dark gray with… dark gray on light gray.
It may not sound terribly exciting, but I do quite prefer the contrast.</p>

<h3 id="flocking">Flocking</h3>
<p>The basic enemies (little spider-bot things in 2.0.0) now move in a <a href="https://en.wikipedia.org/wiki/Boids">flock</a>, much like the skulls in Devil Daggers.
This looks cooler and also makes their movement more predictable to the player, allowing you to survive more easily while still having the fun experience of facing down a huge swarm of robots.</p>

<h3 id="flight">Flight</h3>
<p>Sometimes, just tweaking numbers can have a big effect on game feel.
In this case, I mainly just sped up the movement of the player and the enemies.
But also, I added a “flight” mechanic.
Now, when you move without shooting, you get a significant speed boost to help you avoid enemies and discourage you from just holding down the shoot button, as you could in 1.0.0.</p>

<h3 id="soundscape">Soundscape</h3>
<p>The original sounds for Terminated came from <a href="https://jfxr.frozenfractal.com">jfxr</a>, which gave it a retro, chiptuney sound.
I wasn’t satisfied with it though.
I knew I could never recreate the immersive soundscape of Devil Daggers, but I wanted to create something meatier and more grounded.
So, I redid the sounds for just about everything in the game!</p>

<h3 id="walls">Walls</h3>
<p>Unlike Devil Daggers, the arena in Terminated has walls now.
No longer can you anticlimactically fall off the edge of the world while enemies fly freely over the abyss.
Instead, the opposite is true!
Small enemies will break if they collide with the walls, but you can bump into them no problem.
Though you may still want to avoid the perimeter, because that’s where all the enemies spawn.</p>

<blockquote>
  <p><strong>Historical note:</strong>
All the above changes were made back in March 2022, but from here on down, everything was done <em>yesterday</em>!
More on that later…</p>
</blockquote>

<h3 id="random-waves">Random Waves</h3>
<p>The enemy waves in Terminated 1.0.0 were entirely hard-coded; the enemies that spawned at any given time were always the same, even though they would be different positions.
This was a holdover from Devil Daggers, which probably had just a <em>bit</em> more thought put into the pacing and balance of its waves.
In my case, I’m less interested in making a perfectly fair spawning system for players to compete on a global leaderboard, and more interested in something fun and varied to play for myself.</p>

<p>Therefore, I made it so each wave spawns up to a certain number of “difficulty” points worth of enemies, increasing with each wave.
This way, the challenge increases steadily and the waves vary more each run.</p>

<p>I had the idea to implement this system after seeing the same thing done in a game made by some UNL Game Dev Club friends: <a href="https://store.steampowered.com/app/2667680/cyber_serpent/">cyber_serpent</a>.
I’m sure it wasn’t the first to do random waves this way, but it was the first game where I identified the system and saw it put to good use.
(Go check out cyber_serpent by the way; it’s free and even more fun than Terminated!)</p>

<h3 id="new-main-menu">New Main Menu</h3>
<p>While I have a certain fondness for the utilitarian, non-modal main menu of Terminated 1.0.0, I felt the need to make a proper menu for 2.0.0.
I’m not exactly known for stylish menus, but I think this one turned out nicely.</p>

<h3 id="bigger-level">Bigger Level</h3>
<p>This is another simple number tweak, but increasing the map size by 50% allows more room for chaos to build up while giving you some extra space to survive and experience it.</p>

<h3 id="high-score-tracking">High Score Tracking</h3>
<p>This is a pretty small thing, but important for a game like this!
Now you can try to improve your PB without having to write in down outside of the game like a Neanderthal.</p>

<h3 id="controller-support">Controller Support</h3>
<p>I suppose they don’t call ‘em “twin-stick shooters” for nothing!
I don’t play with controller, so this was a bit of an afterthought, and I don’t know exactly how it’s <em>supposed</em> to feel, but I think I got it working pretty well.
If you’re a true twin-stick player, let me know what you think.</p>

<h2 id="why-200-now">Why 2.0.0 Now?</h2>

<p>As I mentioned above, most of the work for 2.0.0 was done in two chunks: one in March 2022, and one literally yesterday.
Considering the apparent 3 year hiatus, you may be wondering why I didn’t release 2.0.0 sooner.
In fact, asking myself that very question is partially why it came out today!</p>

<h3 id="intermittent-development">Intermittent Development</h3>
<p>In the time since 2022, I worked on Terminated <em>very</em> intermittently, occasionally taking a few hours here and there to refactor or bugfix my noob-level Godot code.
Remember, this was my first solo Godot project, and I’m still using the same codebase as when I started!
Whether or not that was a wise use of time, compared to starting again in a new repo, is another matter… but by now I’ve shaped it into something that’s fairly nice to work with, so it’s a moot point.</p>

<p>Overall, this practice of gradually tweaking and refactoring old projects is pretty typical for me.
Along with creating entirely new projects, I tend to find it less intimidating than making big additions to big projects.
Of course, you need to make big additions to be able to build the most impressive creations in the long run, hence it’s a bit of a problem.
I doubt this is just a “me” thing; it’s probably some combination of software architecture hurdles and executive dysfunction.</p>

<p>So when I sat down yesterday, looked at my (long) list of Godot projects, and chose Terminated to open on a whim, I certainly was not planning to have a whole 2.0.0 release ready by the end of the day.
I was just hoping to fix a few game-breaking regressions I knew about and get it to a functional enough state to share with people again.
But after fixing said bugs and making various improvements as I saw fit, I began to realize that the game was actually in a pretty solid state!
Solid enough, perhaps, to release…?</p>

<h3 id="grand-plans">Grand Plans</h3>
<p>Part of why Terminated has been in development limbo over the last few years is because I have some really cool ideas that I think would give it a unique gameplay loop and an identity beyond just a typical top-down shooter.
I don’t think I’m ready to talk about this new design just yet, and I’m probably making it sound cooler than it is, but it does make me a little excited.</p>

<p>The prospect of implementing it, however, despite being entirely doable given my skills and experience, is exactly the kind of intimidating thing that can put me off of working on the game as a whole for indefinite time spans.
After all, wouldn’t it be better to release all this cool new stuff in one go?
And maybe take it seriously and do a commercial release or something?
As you can probably guess, those kinds of thoughts aren’t really helpful in actually getting me to sit down and work on things.</p>

<p>Putting those ideas aside and lowering the bar for 2.0.0 allowed me to realize that there wasn’t actually that much more work that needed to be done to get the game to a release-able point.</p>

<p>Long story short: I’ve realized I shouldn’t let my aspirations for what Terminated could eventually be stop me from sharing what it is now.
And that’s why I decided to just go ahead and make a release out of it!</p>

<p>Alright, that’s enough introspection for what should probably be a quick post about a video game update.
Onward!</p>

<h2 id="whats-next">What’s Next?</h2>

<blockquote>
  <p>3.0.0 when???</p>
</blockquote>

<p>If you’re hyped about those tantalizingly vague ideas I mentioned in the last section, don’t get your hopes up too much.
Like I said, it’ll take a good bit of work to add all that stuff, and it’s not necessarily my top priority now that I’ve reached the milestone of having Terminated playable once again.
I’ve got a bunch of other side projects competing for my attention, and it’s likely my next release will be something else entirely.
So keep an eye out for that, I guess.</p>

<p>See you then!</p>]]></content><author><name></name></author><category term="games" /><category term="projects" /><category term="terminated" /><summary type="html"><![CDATA[ERROR: FAILED TO TERMINATE ROGUE AI. INITIATING WEAPONIZED SHUTDOWN PROTOCOL.]]></summary></entry><entry><title type="html">SSG Wars: Return of the Jekyll</title><link href="https://frie.dev/blog/2025/03/08/return-of-the-jekyll.html" rel="alternate" type="text/html" title="SSG Wars: Return of the Jekyll" /><published>2025-03-08T00:00:00-06:00</published><updated>2025-03-08T00:00:00-06:00</updated><id>https://frie.dev/blog/2025/03/08/return-of-the-jekyll</id><content type="html" xml:base="https://frie.dev/blog/2025/03/08/return-of-the-jekyll.html"><![CDATA[<p>Four and a half years ago, I <a href="/blog/2020/09/22/goodbye-jekyll.html">switched away from Jekyll</a> to <a href="/blog/2020/10/03/custom-ssg.html">create my own static site generator</a> out of shell scripts and duct tape.
Now, the epic saga has come full circle, and I am once again using Jekyll to generate my website!</p>

<p>Here’s everything that’s happened in the meantime.</p>

<h2 id="the-story-so-far">The Story So Far</h2>

<p>(If you don’t care about the lore, you can <a href="#a-new-website-design">skip</a> the prequels.)</p>

<h3 id="the-maugriftium-menace">The Maugriftium Menace</h3>

<p>After making the first version of my SSG script in October 2020, I continued augmenting my website with various categories pages, including music and videos.
Predictably, this caused my my original shell script SSG to balloon into a monster haunted by <a href="https://stackoverflow.com/a/1732454">HTML-parsing regex</a> and <a href="https://docs.python.org/3/howto/regex.html#the-backslash-plague">plagued by backslashes</a>.
So much for “elegance” and “minimalism”, huh?
By abandoning Dr. Jekyll, I had become Dr. Frankenstein.</p>

<p>In general, the larger a shell script gets, the more the flaws of the shell as a programming language begin to rear their heads, and in this regard, my script was well on its way to attaining hydra status.</p>

<h4 id="the-purge">The Purge</h4>
<p>I had stopped using version control for my website at this point (<em>the horror!</em>), so I don’t have exact dates here, but sometime after April 2021, I decided to simplify my website, removing the blog, videos, Stagit index, and all other non-project pages.</p>

<p>There were a variety of reasons for this culling.
For one, I had realized that I was the antithesis of a consistent blogger, and I decided I’d rather have an “evergreen” website than one that looks neglected and malnourished.
For another, I was gradually wanting to appear more professional online, and the goofy tone I was using on various pages was unbefitting of a proper corporate tech bro.</p>

<p>In any case, trimming all this juicy fat from my site allowed me to lop a few heads off the hydra that was my SSG.
Nonetheless, I still needed it for adding a header and footer to each page, and for generating my project index.</p>

<p>I also took down some of the <a href="/blog/2021/02/14/site-updates.html#servers">servers I was running</a> — IRC and Mumble, but not email.
It was a good learning experience to set them up, but they were predictably barren, given the nonexistent nature of my “fanbase”, and they were creating a potential security vulnerability just by sitting there unmaintained.
There was a time where I was regularly chatting with one friend on my IRC instance, but we eventually went back to the increasingly commercialized but vastly more convenient option of Discord.</p>

<h3 id="attack-of-the-alpines">Attack of the Alpines</h3>

<h4 id="friedev">frie.dev</h4>
<p>In the late spring/early summer of 2022, I transitioned away from my “Maugrift” identity to my current “friedev” identity, and with that came a new domain for this website.
A new domain needs new branding, so I made some updates to the layout, CSS, and avatar/favicon.</p>

<p>The rebrand to “friedev” was driven by that same desire to look more professional, and it ticked most of the boxes for a decent alias.
I’m a sucker for double entendres, and “frie”, in case it’s not obvious, is 1) the first 4 letters of my last, and 2) pronounced “free”, creating the phrase “free dev”, which is pretty apt considering I’m a big fan of free software.
Also, I only later learned that “frie” in Danish does, in fact, translate to “free”.
Convenient!</p>

<p>As for setting up redirects, I, uh, didn’t.
I just let the domain expire to save an entire $10 a year (oh yeah, epic win for frugality).
I wasn’t particularly worried about people not being able to find my new domain, since I was (and still am) basically a nobody on the internet.
I figured people who actually knew me would be able to find me through my other profiles that linked to the new site (or because I would’ve already excitedly told them “I have a new website btw”).</p>

<p>One consequence of relinquishing maugrift.com is that apparently there are trolls out there who look for sites that people used to own and buy them up.
Who would’ve guessed, right?
It’s not like it’s the internet or something.
At one point, it was serving some Chinese web games, and now some Chinese sports… game… thing…?
I don’t know.
You probably shouldn’t go there.</p>

<h4 id="alpine-linux-vps">Alpine Linux VPS</h4>
<p>I took the opportunity to spin up a new, cheaper VPS, still using <a href="https://www.vultr.com/">Vultr</a>.
This time, I installed <a href="https://www.alpinelinux.org/">Alpine Linux</a> instead of Debian.
It’s very light, and while I hadn’t had a great experience using it as a desktop distro, it fit the server use case pretty well.</p>

<p>On Alpine, I faced my greatest challenge yet: setting up an email server.
On Debian, I had been able to run the convenient <a href="https://github.com/LukeSmithxyz/emailwiz">emailwiz</a> script, but it wouldn’t work out of the box on Alpine.
Instead, I spent an evening or two running the script one relevant line at a time, interspersed with frequent checks of Alpine Linux’s somewhat sparse documentation on the subject of email servers.
OpenDKIM was my true nemesis, but I eventually got it working, and I was <em>pretty</em> sure the configuration was good enough.</p>

<h4 id="when-the-world-needed-him-most-he-vanished">When the world needed him most, he vanished…</h4>
<p>Around this time, I had entered my recluse arc, in which I minimized my online presence by deleting as many accounts and public profiles as I could justify to myself.
I may dig into my motivations for all this in another post, but in short, it boiled down to fear and antiestablishmentarianism (not to be confused with its more notorious cousin).</p>

<p>This website was one of few exceptions to my vendetta, since it was something I had nearly full control over, and without any other profiles, I’d have nowhere else to share my ostensibly cool stuff.
My itch.io pages and GitHub repositories were not so lucky, and joined the casualties of this purge.
Surely, I figured, any sufficiently cool contributor would know how to use the obscure <a href="https://git-send-email.io/">git send-email</a> command, right?</p>

<h4 id="server-side-includes">Server-side includes</h4>
<p>In the months prior to the transition, I had discovered <a href="https://en.wikipedia.org/wiki/Server_Side_Includes">server-side includes</a>, or SSI, allowing me to replicate one of the most useful features of Jekyll.
Now, my SSG script didn’t need to be the thing that added headers and footers to pages; the pages themselves could tell nginx to do it with directives like <code class="language-plaintext highlighter-rouge">&lt;!--#include virtual="content.html" --&gt;</code>.
Although the versatility of this feature was limited, it still radically improved my site organization.</p>

<h4 id="readme-generation">README generation</h4>
<p>Without GitHub repos, there was now no easy way to read the READMEs for my projects without cloning them.
And so it was here that I implemented the most useful feature of my SSG: generating project pages from their READMEs.</p>

<p>My previous approach to writing the content for my project webpages, as far as I can recall, was to manually adapt the content of each markdown README into an HTML webpage, potentially adding or removing various tidbits in the process.
But of course, copy and paste is evil!
Under this system, my project webpages could fall out of sync with their respective READMEs, requiring me to update both places independently.</p>

<p>Thus, using the <a href="https://kristaps.bsd.lv/lowdown/">revolutionary new technology</a> of converting Markdown to HTML (the same approach I had once <a href="/blog/2020/09/22/goodbye-jekyll.html#the-choice-of-html">criticized</a>), I could easily keep my webpages in sync with their READMEs.
Crucially, this also made it less annoying to add new projects to my website, making me more likely to actually release things.</p>

<h4 id="pup">pup</h4>
<p>Up to this point, regex was still a necessary evil to allow my SSG to generate the index of projects on my homepage.
The script would search through each project page and clumsily extract various bits of information, like the title, release date, and excerpt, and then trim them up and package them into a neat little capsule on the front page.</p>

<p>Fortunately, I found (and actually got around to implementing) a better way to do this step that didn’t involve nearly as much <code class="language-plaintext highlighter-rouge">grep</code>‘ing and <code class="language-plaintext highlighter-rouge">sed</code>‘ing: <a href="https://github.com/ericchiang/pup">pup</a>!
pup allows you to extract information from HTML using CSS selectors, which just makes way more sense.
This change made the whole script a fair bit nicer, though some might call it lipstick on a pig (or a dog, in this case?).</p>

<h3 id="revenge-of-the-vps">Revenge of the VPS</h3>

<p>Since the 2022 changes, I think things remained mostly the same through 2023, with only the occasional project update.</p>

<h4 id="migadu">Migadu</h4>
<p>In May 2024, I started using <a href="https://migadu.com/">Migadu</a> to run my mail server.
(So much for that grueling Alpine Linux email installation, I guess…)</p>

<p>The desire to transition away from self-hosting my email server stemmed from laziness and risk-aversion (i.e. fear, again).
Basically, I had decided that email was too important to leave in my own hands as a less-than-competent Postfix administrator.
Migadu provided an enticing alternative without the arbitrary restrictions and pricing schemes of most other email providers.
So far, I’ve had a good experience with Migadu, but that’s a subject for another blog post.</p>

<h4 id="github">GitHub</h4>
<p>This left me with the realization that all I was using my VPS for was to host my website and Git repos.
I had already been considering putting my repos back on GitHub, having begrudgingly acknowledged its ubiquity and the power of its network effect.
If I wanted anyone to actually be able to find my repos and get any use out of them, let alone contribute, I would need to return to the dark side.</p>

<p>Fortunately, however, <a href="https://drewdevault.com/2018/07/23/Git-is-already-distributed.html">Git itself is fundamentally decentralized</a> and repos are pretty portable, so it’s not like creating a GitHub remote for my repos meant forever surrendering them to Microsoft.
I could easily create other remotes on other forges, and mirroring my repos across them probably wouldn’t be too painful.
And so, in November 2024, it was done: I was back on GitHub.</p>

<p>This left my VPS with very little to do — just hosting my website.
And thus I decided to put it out of its boring existence and save a whole $5 per month (another common frugality W).</p>

<h4 id="github-pages">GitHub Pages</h4>
<p>Since I was using GitHub again, it seemed only fitting to host my website on GitHub Pages.
(I did consider some alternatives, and I’ll probably talk about them in another separate post, but GitHub Pages was just the easy and obvious choice here.)
And thus the cycle was almost closed, leaving only…</p>

<p>One problem: GitHub Pages didn’t support SSI.
<em>Well,</em> I thought, <em>if I’m back on GitHub Pages, maybe I can use its CI/CD to run a basic SSG that just handles includes?</em>
Of all the SSGs I bothered to look at, Jekyll seemed like the easiest one to use to implement the basic include functionality without having to overhaul the rest of my website, and so I added it.</p>

<p>And that’s how things have been for the last few months.
Until now!</p>

<h2 id="a-new-website-design">A New Website Design</h2>

<p>Behold: yet another website design!</p>

<p>This time around, I have embraced the power of Jekyll to generate a fully-featured site in a relatively elegant way.
As is required by GitHub Pages (on the free tier at least), <a href="https://github.com/friedev/website/">the repo</a> is public, so you can see exactly how I put it all together.</p>

<h3 id="the-strange-case-of-dr-jekyll">The Strange Case of Dr. Jekyll</h3>

<p>I chose to fully commit to using an off-the-shelf SSG because I realized I would never be able to compete with their enviable feature sets in a maintainable way, especially not with a shell script.
Besides, I’m not really interested in coding an SSG myself; after all, why reinvent the square wheel when there are lots of round wheels available for free?</p>

<p>This has meant recognizing and abandoning my tendencies toward extreme minimalism and independence.
I had gotten to the point of embracing these things for their own sake, all while practicality had taken a back seat.
This shift in mindset has been brewing over the last year or more, and has culminated in various changes to my workflow, all of which I’ve been very happy with.
I think yet another article is in order to talk about them all.</p>

<p>After deciding that I was going to use an SSG, I was inclined to try Hugo for various superficial reasons.
It has more stars on GitHub than Jekyll, it’s written in Go instead of Ruby, and it has a proper package in the <code class="language-plaintext highlighter-rouge">extra</code> repository on Arch Linux.
Despite these nice things, I found myself a bit intimidated by the sprawling organization of the documentation as I started reading it, and slightly put off by the apparent requirement of using a theme.
It seemed like it might’ve been more difficult to port my existing site to Hugo than to gradually transition to using more of Jekyll’s functionality.</p>

<p>Now, I probably should’ve put more effort into prototyping a Hugo site locally and seeing how easy it would be to port my existing site to Hugo… but I didn’t feel like it.
Jekyll’s docs were more friendly, and since I was already using it for includes, it was easy to slowly start trying out more of its features.</p>

<h3 id="no-themes">No themes?</h3>

<p>I did strongly consider using a third-party theme for Jekyll, specifically the <a href="https://chirpy.cotes.page/">Chirpy</a> theme.
I think it looks fairly attractive and has a lot of extra little add-ons to Jekyll that would be nice.</p>

<p>Unlike Hugo, I did put some effort into mocking up a site with Chirpy, but I eventually decided against it.
Mainly, it just had too much going on under the hood for me to wrap my head around, which I knew would get in the way of me customizing things how I might like to.
Furthermore, I knew I would feel kind of dirty having a site with so much frontend code — over 250 kB of JavaScript and CSS (after minification!).</p>

<p>Maybe that’s just my old minimalist ways dying hard, but I feel much better knowing that I’ve made everything on my site, and I know how it all works.
And fortunately, Jekyll has turned out to be powerful enough to do everything I needed.</p>

<h3 id="screw-it-ill-make-my-own-theme">Screw it, I’ll make my own theme</h3>

<p>Despite decrying JavaScript and CSS bloat just now, I did decide to add icons to my site from <a href="https://fontawesome.com/">Font Awesome</a>.
That adds about 380 kB of web fonts and CSS that have to be downloaded on first page load (which, in fairness, Chirpy would have also loaded, in addition to its custom JavaScript and CSS).
I stand by this decision though; they just look nicer, and, more importantly, I can fit more icons into the same space compared to textual links.
For most people, they’re just as readable as text, if not more (one could even say they’re… iconic?), though I do apologize if it interferes with screen readers and the like.</p>

<p>In any case, there’s also plenty of new CSS styling going on here, all lovingly hand-crafted on top of my previous stylesheet.
I kinda liked the blocky theme I had going on, but I also dig the slightly rounded aesthetic I’ve come up with.
(If Microsoft can get away with changing <code class="language-plaintext highlighter-rouge">border-radius</code> and passing it off as a whole new UI, then why shouldn’t I?)
Same with adding borders to stuff; I just tried it on a whim and I think it looks kinda nice.
I’ll probably switch to Sass sometime Soon™, but I’m keen to get this redesign out the door first, since switching to Sass would just be an internal refactor.</p>

<p>Long-time knowers of my existence may have noticed that I’ve brought back the old Maugrift avatar!
For a while during the initial friedev era, I had switched to a simple white-on-black @ sign as my avatar, in reference to 1) the first letter of my name, and 2) the classic roguelike player symbol.
However, I eventually decided it was too generic, and so I’ve switched back to the space knight logo I made for my Maugrift persona, which is unique to me and still looks cool (well, at least <em>I</em> think it does, and I have impeccable taste, not to mention a great sense of humility).</p>

<h3 id="gone-but-not-forg-wait-its-not-gone">Gone but not forg— wait, it’s not gone?</h3>

<p>Funnily enough, I’m still using the last remnants of my SSG script!
At this point though, it’s only to keep the READMEs up to date — no more HTML parsing (phew).</p>

<p>One slightly ugly, but useful, feature is looking for links in each README that point to other files in the repo (e.g. <code class="language-plaintext highlighter-rouge">LICENSE.txt</code>), and redirecting them to the corresponding file on GitHub’s web view.</p>

<p>Thanks to the power of Jekyll layouts and front matter, I’m able to generate each project page without any writing any content manually.
All I have to do is specify the metadata and the layout does the rest!</p>

<h2 id="the-blogger-strikes-back">The Blogger Strikes Back</h2>

<p>If you’re reading this, you just <em>might</em> have noticed that the blog is back!
I’ve had various things I’ve felt like writing about for a while now, and this seems like a nice place to do it.</p>

<p>Don’t expect any kind of consistency, at least not yet.
As I’ve discovered, I’m not exactly the most consistent blogger, nor the most consistent person in general when it comes to working on side projects.</p>

<p>That being said, I <em>have</em> been working on some games in my spare time, which I may start writing about on this blog when I feel like procrastinating on the games themselves.
And, although the blog has been gone for a while now, that hasn’t stopped the site from fulfilling it’s main purpose as a project portfolio.
Over the last few years, I’ve published a decent number of projects, which you can check out on the <a href="/projects">Projects</a> page if you haven’t already.</p>

<p>If you want to get notified about future blog posts, you can subscribe to the <a href="/feed.xml">RSS feed</a>, generated with the help of the <a href="https://github.com/jekyll/jekyll-feed">jekyll-feed</a> plugin.
(And if you don’t use RSS, you really should try it!)</p>

<p>If you made it this far, thanks for reading this unexpectedly long article.
Until next time!</p>]]></content><author><name></name></author><category term="ssg" /><category term="website" /><summary type="html"><![CDATA[Four and a half years ago, I switched away from Jekyll to create my own static site generator out of shell scripts and duct tape. Now, the epic saga has come full circle, and I am once again using Jekyll to generate my website!]]></summary></entry><entry><title type="html">Announcing Minieval: a tiny medieval city builder</title><link href="https://frie.dev/blog/2021/04/24/announcing-minieval.html" rel="alternate" type="text/html" title="Announcing Minieval: a tiny medieval city builder" /><published>2021-04-24T00:00:00-05:00</published><updated>2021-04-24T00:00:00-05:00</updated><id>https://frie.dev/blog/2021/04/24/announcing-minieval</id><content type="html" xml:base="https://frie.dev/blog/2021/04/24/announcing-minieval.html"><![CDATA[<p>Minieval is a tiny medieval city builder, inspired by <a href="https://store.steampowered.com/app/1046030/ISLANDERS/">Islanders</a>.
You can play it online on <a href="https://friedev.itch.io/minieval?password=minieval">itch.io</a> or check out the source code on <a href="https://github.com/friedev/minieval">GitHub</a>!</p>

<p>In this post I’ll be talking about the background of the game and the development process.
If you’re interested in more details about the game itself, check out its <a href="/minieval">project page</a> on my website.</p>

<p>Minieval has been developed over the course of the spring, starting around March 2 and releasing today, April 24.
Looking back on it, that’s a lot less time than it felt like!
I developed the game along with a team from the <a href="https://unl-game-dev-club.github.io">UNL Game Development Club</a> consisting of Kalen Wallin, Evan Mielak, Viet Ninh, Jackson Herman, and Ethan Fox.
I was the team lead and did most of the work on the game, but I want to thank all my team members for their help; without their contributions, the game wouldn’t be as fully featured as it is now.</p>

<p>The original idea for the game came from <a href="https://store.steampowered.com/app/1046030/ISLANDERS">Islanders</a>, a minimalist 3D city builder.
It’s a great little game and I’d recommend giving it a try if you haven’t already.
The idea is to place buildings near other buildings that grant bonuses, while avoiding the interactions that result in penalties.
One Simple Trick™ I have to come up with game ideas is to take an existing game design and think of how it would work in another format or medium.
In this case, I thought, “what if Islanders was set on a 2D grid?”
It probably wouldn’t be as visually appealing as its 3D counterpart, but it would surely be much easier for a team of amateur game developers to pull off.</p>

<p>Over time, the idea evolved a bit.
One of the first main differences that emerged was splitting up the game’s resources into Currency and Victory Points (VP), rather than having a single resource that’s used for constructing buildings and also used to determine your final score.
This split resulted in far more interesting strategic decisions; for instance, “Do I build this expensive building that gives me lots of VP, or do I continue to save up currency until I can afford a better one?”</p>

<p>Another major change of the format was the introduction of roads.
I imagine adding roads to a 3D game without some sort of grid or voxel system would be quite challenging, but in the 2D grid format, it wasn’t as daunting a task.
In Minieval, you can create road networks that cause currency interactions to happen between all buildings placed next to any part of the road.
This means you can more easily scale up your city’s income, but sometimes you want to avoid building on a road to avoid negative building interactions, and setting up the road network in the first place takes a lot of turns.</p>

<p>Minieval was created using <a href="https://godotengine.org">Godot Engine</a>, a powerful open source game engine.
As a fan of more programmatic approaches to game development, I was hesitant to choose Godot at first.
However, while developing Minieval, I’ve thoroughly enjoyed using it.
In my experience, it does a great job at simplifying several annoying parts of the development process, while still allowing you to control basically everything through code, which is a perfect balance in my opinion.
For an indie game dev team, I think it’s a great option.</p>

<p>This game has been really fun to work on!
Surprisingly enough, I also think this might be the first game I’ve made that’s fun to play in its own right, at least in my opinion.
Furthermore, this has been my first time using a proper graphical game engine (<a href="/minius-maximus">Minius Maximus</a> doesn’t really count since I pretty much just made the music).
Now that I’m more familiar with Godot, I’m looking forward to creating more games with it, so stay tuned!</p>

<p>There may be some small patches to Minieval over the course of the summer, but don’t expect anything too major unless the game becomes super popular or something.
Like I said, this game has been a blast to work on, but I’m excited to work on some new ideas too!</p>

<p>Thanks for reading, and I hope you enjoy the game!</p>]]></content><author><name></name></author><category term="games" /><category term="minieval" /><category term="projects" /><summary type="html"><![CDATA[Minieval is a tiny medieval city builder, inspired by Islanders. You can play it online on itch.io or check out the source code on GitHub!]]></summary></entry><entry><title type="html">Announcing MusiCLI: a MIDI sequencer for the terminal</title><link href="https://frie.dev/blog/2021/02/17/announcing-musicli.html" rel="alternate" type="text/html" title="Announcing MusiCLI: a MIDI sequencer for the terminal" /><published>2021-02-17T00:00:00-06:00</published><updated>2021-02-17T00:00:00-06:00</updated><id>https://frie.dev/blog/2021/02/17/announcing-musicli</id><content type="html" xml:base="https://frie.dev/blog/2021/02/17/announcing-musicli.html"><![CDATA[<p>MusiCLI (pronounced “musically”) is a simple, tracker-like, MIDI sequencer that runs entirely in the terminal.</p>

<p>I developed MusiCLI alongside David Ryan for <a href="https://cornhacks.com/">CornHacks 2021</a>, UNL’s student-led hackathon.
For a hackathon project, I would say it turned out pretty good!
I wouldn’t say this is anywhere near ready for “production” use, but the core functionality is there.</p>

<p>Currently, MusiCLI supports multiple channels, multiple instruments (including drums), and arbitrary-length songs.
The editor is fairly bare-bones for now, but it supports simple modal editing (via caps lock) and playing songs from within the editor.</p>

<p>Some major features we’d still like to add include loading MIDI files, playing individual notes as they’re entered, and stepping through the song as it’s played.
There are plenty of other convenient features we want to add too, but these represent the most significant technical hurdles.</p>

<p>To get MusiCLI, simply clone it from <a href="https://github.com/friedev/musicli">GitHub</a>, install the dependencies, and compile.
Note that MusiCLI has only been tested on Linux, and probably won’t work on other operating systems.</p>

<p>MusiCLI is written in C++ and based on the great <a href="https://midifile.sapp.org/">Midifile</a> library by Craig Sapp.
It is licensed under the GPL, and we’re open to contributions via GitHub pull requests.
For more information, see the <a href="/musicli">project page</a>.</p>

<p>That’s all for now, thanks for checking out this little project!</p>]]></content><author><name></name></author><category term="musicli" /><category term="projects" /><category term="software" /><summary type="html"><![CDATA[MusiCLI (pronounced “musically”) is a simple, tracker-like, MIDI sequencer that runs entirely in the terminal.]]></summary></entry><entry><title type="html">Site updates!</title><link href="https://frie.dev/blog/2021/02/14/site-updates.html" rel="alternate" type="text/html" title="Site updates!" /><published>2021-02-14T00:00:00-06:00</published><updated>2021-02-14T00:00:00-06:00</updated><id>https://frie.dev/blog/2021/02/14/site-updates</id><content type="html" xml:base="https://frie.dev/blog/2021/02/14/site-updates.html"><![CDATA[<p>It’s been a while since I wrote a post on here, and a lot has changed!
Here’s a not-entirely-quick review of all the new stuff.</p>

<h2 id="content">Content</h2>

<p>Overall, there’s a lot more <em>stuff</em> on this site now.
To be honest, I forget how much stuff was already added back when I made the last post, so it’s possible I’ll end up being redundant or leaving some things out.
Anyway, the point is that this site is actually quite a bit more useful now.
Ideally, I wouldn’t need any other sites or accounts, and I could just do everything here!
That’ll probably never happen, but I think it’s a good goal to reach for.</p>

<h3 id="music">Music</h3>

<p>I believe I may have had an early version of my music page around when I wrote the last post, but in any case, it’s now a bit cooler!
If your browser supports it, you can now listen to each song online without having to download it.
One small thing I should address: if you’re one of the two people who listened to the original Beeps from the Box album on SoundCloud, you might remember that I included some cover songs.
These have been removed for the release on this site to avoid copyright problems; I’d like the content on this site to be as original as possible.</p>

<h3 id="videos">Videos</h3>

<p>One of the fancier additions is a section of the site where you can watch videos I’ve made.
If you have a modern browser, you can stream the videos online thanks to fancy HTML5 video embedding.
Alternatively, you can download the videos to watch whenever you want.
I haven’t linked to it on the videos page yet, but all the videos are licensed under <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a>, the same license I’m using for my music.</p>

<p>For now, the only videos I’ve uploaded are some speedruns of games, which are nice because their file sizes are generally pretty low.
If you’ve followed my YouTube channel, you’ll know that I also made some piano covers a while back.
However, I don’t intend to upload these to my site for the same reason as the BeepBox covers I talked about above.
(Technically the legality of speedruns and gameplay videos is also debatable, but as far as I’m aware, the general consensus is that they’re okay.)</p>

<h3 id="git">Git</h3>

<p>This is a public index of all my self-hosted Git repositories, generated using <a href="https://codemadness.org/stagit.html">Stagit</a>.
This makes it perhaps the only part of my site that isn’t entirely written or generated by me, although I do have a script that does a little post-processing of the output to tweak some things to my liking.
Anyhow, this part of this site might be nice if you want to browse the source code of my projects online, subscribe via RSS, or clone them over HTTPS.</p>

<h3 id="projects">Projects</h3>

<p>This part of the site has been updated with links to binary and source downloads of my projects where applicable.
This means you won’t have to go through another service like GitHub or itch.io if you want to download them.
Another point for maugrift.com!</p>

<h3 id="donate">Donate</h3>

<p>I’ve added this page just in case any generous people with spare cash feel like supporting what I do.
For now, I’m only accepting donations via PayPal and itch.io, but I may support some cryptocurrencies when I get around to finding good wallets.
Keep in mind that donations are totally optional and I’m going to keep making and releasing free stuff as long as I can!</p>

<h2 id="servers">Servers</h2>

<p>In addition to this website, I’m now hosting a few neat chat servers here on maugrift.com!</p>

<h3 id="irc">IRC</h3>

<p>I’m not a long-time IRC user like many others out there, but it seems like a very nice, minimal chat protocol.
I’m hosting my own IRC server using UnrealIRCd, which is pretty quiet for the time being, but it’s there if anyone wants to chat!
I plan on switching to Oragono some time Soon™, since it has built-in IRC services and good IRCv3 support.</p>

<h3 id="mumble">Mumble</h3>

<p>In case you’re not familiar, Mumble is another seemingly old-school chat program, although it specializes in voice chat more so than text chat.
I host a Mumble server using the Murmur daemon, so if you want to talk to me using your vocal cords, send me an email or IRC message and we can meet on there.</p>

<h3 id="matrix">Matrix?</h3>

<p>I’ve considered hosting a Matrix server, although I haven’t found a server implementation that I’m fond of yet.
Synapse, the reference implementation written in Python, seems convoluted to set up and maintain; Dendrite, the new Go-based implementation, doesn’t seem stable enough yet; and it doesn’t seem like other community-made server software like Construct is up to scratch yet other.</p>

<p>Furthermore, I haven’t found any amazing Matrix clients yet either.
I really dislike Element because it’s an Electron application and thus is accompanied by all the nonsense that comes with any Electron application.
(See <a href="https://drewdevault.com/2016/11/24/Electron-considered-harmful.html">Electron considered harmful</a> and <a href="https://josephg.com/blog/electron-is-flash-for-the-desktop/">Electron is flash for the desktop</a>.)
Gomuks seems pretty good, although it doesn’t quite have feature parity with Element, so you still need Element for a lot of things.</p>

<p>As a protocol, I have nothing against Matrix; it seems like a good, general-purpose chat protocol that’s more modern than IRC without making too many compromises.
I just want the ecosystem around it to mature some more before I get involved.</p>

<h2 id="automation">Automation</h2>

<p>In addition to the more visible changes, I’ve done some tinkering on the backend to make this site a lot more maintainable so that I can keep adding to it more easily.
If you don’t care about random technical stuff, feel free to skip over this whole section.</p>

<h3 id="page-generation">Page Generation</h3>

<p>This is an improvement that may not be obvious to viewers of the site, but is hugely useful on the backend.
I’ve updated my static site generator to generate index pages for the blog, videos, projects, and the main page.
The organization of these parts of the site has changed a bit to make the generation easier; most notably, every post and video is in a series of directories corresponding to the date.
For instance, this post is in <code class="language-plaintext highlighter-rouge">/blog/2021/02/14/site-updates/</code>.
This seems to be a pretty standard convention on other sites, and it makes sorting posts much easier.</p>

<h3 id="rss-generation">RSS Generation</h3>

<p>Another automation improvement comes from a new script to generate RSS feeds automatically.
One (small) reason why I hadn’t been making any posts after creating the RSS feeds is because I was reluctant to go and manually update the RSS feed.
But no more!
Now with the power of shell scripts, I can simply run my static site generator and the RSS feeds are created automatically, as they should be.</p>

<h2 id="thats-all-for-now">That’s all for now…</h2>

<p>… I think.
Tune in again soon for a very overdue announcement of a new project!</p>]]></content><author><name></name></author><category term="website" /><summary type="html"><![CDATA[It’s been a while since I wrote a post on here, and a lot has changed! Here’s a not-entirely-quick review of all the new stuff.]]></summary></entry><entry><title type="html">The quest to write my own Static Site Generator</title><link href="https://frie.dev/blog/2020/10/03/custom-ssg.html" rel="alternate" type="text/html" title="The quest to write my own Static Site Generator" /><published>2020-10-03T00:00:00-05:00</published><updated>2020-10-03T00:00:00-05:00</updated><id>https://frie.dev/blog/2020/10/03/custom-ssg</id><content type="html" xml:base="https://frie.dev/blog/2020/10/03/custom-ssg.html"><![CDATA[<p>Jekyll is overkill, but can I do better?</p>

<h2 id="wait-what">Wait, What?</h2>

<p>Despite bashing static site generators (SSGs) a bit in my <a href="/blog/2020/09/22/goodbye-jekyll.html">last post</a>, there are some useful aspects to them that I can’t just ignore.
The biggest one for me has been copying all the boilerplate between HTML files (e.g.
the header).
Without an SSG, when I need to make a new page, I usually copy another HTML file and modify it.
As anyone who’s done much programming before can tell you, this is a Bad Idea.
In particular, when I need to make a change to the header under this system, I have to go and <em>manually</em> change the header on <em>each</em> file.
This hasn’t been a big deal since my site has been relatively small, but I could see the risk of technical debt steadily growing.</p>

<p>And thus, I set out on my quest to write a custom SSG!</p>

<p>As it turns out, it was actually quite easy to do.
Over the course of a day, I was able to whip up a shell script that would do everything I needed.</p>

<h2 id="how-it-works">How It Works</h2>

<p>The core functionality of this script is copying every file named <code class="language-plaintext highlighter-rouge">content.html</code> on my website, adding a <code class="language-plaintext highlighter-rouge">header.html</code> and <code class="language-plaintext highlighter-rouge">footer.html</code>, and outputting the result to an <code class="language-plaintext highlighter-rouge">index.html</code> file in the same directory.
Thus, when I want to write a new page, I just need to write the main page content in a <code class="language-plaintext highlighter-rouge">content.html</code> file and then run <code class="language-plaintext highlighter-rouge">./ssg</code>.
Easy!</p>

<p><em>(And yes, this means that you can go to the <code class="language-plaintext highlighter-rouge">content.html</code> file for any page on this and see the raw, unstyled page content.)</em></p>

<p>One other convenient feature I decided to add is the ability to update the <code class="language-plaintext highlighter-rouge">&lt;title&gt;</code> tag with the name of the page.
Since I just use a <code class="language-plaintext highlighter-rouge">&lt;h1&gt;</code> tag for the title of most pages, I’m able to extract the page title from the <code class="language-plaintext highlighter-rouge">content.html</code> with a simple <code class="language-plaintext highlighter-rouge">grep</code> command.
Then, I run a corresponding <code class="language-plaintext highlighter-rouge">sed</code> command to substitute the name into the <code class="language-plaintext highlighter-rouge">&lt;title&gt;</code> tag.</p>

<h2 id="why-its-great">Why It’s Great</h2>

<ol>
  <li>First of all, this script acts as a perfect substitute for a full SSG, at least for my use case.</li>
  <li>Second, it’s short and easy to understand, so if I need to make any changes, it’ll be easy to do so.</li>
  <li>Finally, it’s super minimal!
I don’t need to have any dependencies or fancy programming environments installed.
Just a good old shell.</li>
</ol>

<h2 id="in-conclusion">“In Conclusion”</h2>

<p>So yeah, making an SSG is easy and totally worth it!
If you don’t feel like making your own, feel free to yoink mine.
It’s not properly licensed or anything (yet), but I’m not gonna sue you for using my little convenience script.
As always, if you have questions, feel free to email me or whatever.
(I should probably make a comment form.
Hmm…)</p>]]></content><author><name></name></author><category term="ssg" /><category term="website" /><summary type="html"><![CDATA[Jekyll is overkill, but can I do better?]]></summary></entry><entry><title type="html">Goodbye Jekyll, Hello HTML!</title><link href="https://frie.dev/blog/2020/09/22/goodbye-jekyll.html" rel="alternate" type="text/html" title="Goodbye Jekyll, Hello HTML!" /><published>2020-09-22T00:00:00-05:00</published><updated>2020-09-22T00:00:00-05:00</updated><id>https://frie.dev/blog/2020/09/22/goodbye-jekyll</id><content type="html" xml:base="https://frie.dev/blog/2020/09/22/goodbye-jekyll.html"><![CDATA[<p>Ahh, sweet minimalism!</p>

<p>It amuses me that the <a href="/blog/2020/05/10/hello-there.html">first post</a> I wrote on this site is all about the infinite power of <a href="https://help.github.com/en/github/working-with-github-pages/setting-up-a-github-pages-site-with-jekyll">Jekyll and GitHub pages</a>, and now here I am running a pure static HTML site off of a VPS.
Might as well take this chance to explain why!</p>

<h2 id="the-choice-of-html">The Choice of HTML</h2>

<p>I’ll admit, I was slightly intimidated at first by the idea of writing a whole site in raw HTML.
Surely that’s an archaic idea at this point in time, right?
Wrong!
Turns out it’s super easy and actually way better.</p>

<p>For one, I have a lot more control over how I design the site and its content.
Before, I was at the mercy of Jekyll’s markdown parser (<a href="https://kramdown.gettalong.org/">Kramdown</a>, I believe), which would compile things into whatever HTML it thought I wanted.
Most of the time, it guessed right, but sometimes I’d end up with situations like this…</p>

<p>I’d write the following markdown:</p>

<div class="language-md highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">-</span> List item.
<span class="p">    -</span> Sublist item.
</code></pre></div></div>

<p>Which Jekyll would convert into the following HTML:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;ul&gt;</span>
    <span class="nt">&lt;li&gt;</span>
        <span class="nt">&lt;p&gt;</span>List item.<span class="nt">&lt;/p&gt;</span>
        <span class="nt">&lt;ul&gt;</span>
            <span class="nt">&lt;li&gt;</span>Sublist item.<span class="nt">&lt;/li&gt;</span>
        <span class="nt">&lt;ul&gt;</span>
    <span class="nt">&lt;li&gt;</span>
<span class="nt">&lt;ul&gt;</span>
</code></pre></div></div>

<p>In this case, I really just wanted a sublist:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;ul&gt;</span>
    <span class="nt">&lt;li&gt;</span>
        List item.
        <span class="nt">&lt;ul&gt;</span>
            <span class="nt">&lt;li&gt;</span>Sublist item.<span class="nt">&lt;/li&gt;</span>
        <span class="nt">&lt;ul&gt;</span>
    <span class="nt">&lt;li&gt;</span>
<span class="nt">&lt;ul&gt;</span>
</code></pre></div></div>

<p>(Note the extra <code class="language-plaintext highlighter-rouge">&lt;p&gt;</code> tag, which results in extra spacing, which looks weird in a longer list.)</p>

<p>Anyway, that’s just one (probably overexplained) example of Jekyll being inconvenient.
And yes, I’m sure there’s a way to make it work the way I intended, but I’ve just found it easier to make minor tweaks like this using HTML.
Probably because it’s more explicit/verbose, and also far better documented.
(That’s not to say Jekyll has bad documentation - far from it.
It’s just that it’s hard to compete with HTML due to the sheer number of people who use it and the number of other resources for it.)</p>

<p>Another complaint I have with Jekyll is that editing the CSS also seemed unnecessarily complicated.
With the <a href="https://github.com/pages-themes/midnight/">theme I chose</a>, I could add custom CSS pretty easily, but editing the existing CSS didn’t even seem to be an option.
Even if I could have edited it, I wouldn’t have known what elements and classes to reference.
And now, with very little effort, I’ve managed to create a website theme from scratch that I think looks basically just as good.</p>

<p>Lastly, HTML doesn’t require any dependencies!
With Jekyll, I had to have a whole Ruby environment installed and run a program to generate the site.
Not only did that require more <strong>b l o a t</strong>, it also ended up being more work in the end, which kinda defeated the point of using a static site generator in the first place.</p>

<p>While writing static HTML requires a bit more typing (<em>gasp!</em>), it gives me way more control over the content I write.
Ultimately, it feels like SSGs don’t really satisfy any sort of meaningful niche.
If you’re really averse to working with “code,” you’re not going to want to use HTML <em>or</em> an SSG; you’d probably use some website builder software.
If you don’t mind getting your hands ever so slightly dirty, why not go full HTML and skip the extra hassle of an SSG?
&lt;/rant&gt;</p>

<h2 id="the-choice-of-a-vps">The Choice of a VPS</h2>

<p>Similarly, the reason for choosing a VPS comes down to freedom (and some other stuff).</p>

<p>First of all, having a VPS is great in that it lets me do so much more STUFF besides just hosting a website.
Basically I’m paying for access to a (virtual) computer with a good internet connection, and thus I can do just about anything with it that I could do with a regular computer (and, in fact, more).</p>

<p>Second, it means I’m not bound to GitHub for hosting.
Instead of relying on them to have the options I might need, I can just change the server config directly.
I still have to rely on my VPS provider (<a href="https://www.vultr.com/">Vultr</a>) to some extent, but nonetheless I get much more <strong>p o w e r</strong>.</p>

<p><em>(I didn’t choose Vultr for any good reason.
From my research, it seemed that the main VPS providers were DigitalOcean, Vultr, and Linode, but that they weren’t much different.
While I can’t speak to the quality of the other two, Vultr has worked perfectly fine for me.
I particularly like the hourly billing and the snapshot system.)</em></p>

<p>Ideally, I would have my own physical server, but that’s not really feasible for me at the moment.
One day…</p>

<h2 id="so-yeah">So Yeah</h2>

<p>There’s my completely unsolicited, slightly in-depth analysis of why I switched to HTML on a VPS.
As always, feel free to tell me why my opinion is wrong.</p>]]></content><author><name></name></author><category term="website" /><category term="ssg" /><summary type="html"><![CDATA[Ahh, sweet minimalism!]]></summary></entry><entry><title type="html">Hello There</title><link href="https://frie.dev/blog/2020/05/10/hello-there.html" rel="alternate" type="text/html" title="Hello There" /><published>2020-05-10T00:00:00-05:00</published><updated>2020-05-10T00:00:00-05:00</updated><id>https://frie.dev/blog/2020/05/10/hello-there</id><content type="html" xml:base="https://frie.dev/blog/2020/05/10/hello-there.html"><![CDATA[<p><em>General Kenobi!
You are a bold one.</em></p>

<p>Welcome, at long last!
The journey has been perilous, and the roads fraught with goblins and trolls, but finally I have arrived, bearing the spoils of a new website.
It menaces with spikes of minimalism and dark themes.
(Thanks to the <a href="https://github.com/pages-themes/midnight">Midnight</a> theme by <a href="https://twitter.com/mattgraham">mattgraham</a>.)</p>

<p>In actuality, setting up the site didn’t take all that long, it was just one of those projects that I had been meaning to work on for a very long time.
Even for someone with very minimal web development experience, the whole process has been surprisingly painless.
Even with my limited experience so far, I would easily recommend the <a href="https://help.github.com/en/github/working-with-github-pages/setting-up-a-github-pages-site-with-jekyll">GitHub Pages + Jekyll</a> route if you’re interested in creating a website.
Besides the custom domain name (which is optional), this approach is entirely free, lightweight, and pretty easy to work with.
If you want an entirely open source solution, there’s also <a href="https://docs.gitlab.com/ee/user/project/pages/">GitLab Pages</a>, which I believe is quite comparable to GitHub’s offering.</p>

<p>Anyway, this site will serve as a hub for me to organize information about my various personal projects.
It will also provide a great way for me to dump the contents of my brain into an endless void, so that’s fun.</p>

<p>Here you can expect to see occasional ramblings on anything from roguelikes and open source software to worldbuilding and music.
If you want updates about any of my rants, I hear Jekyll implements an <a href="/feed.xml">Atom feed</a> that you can subscribe to.</p>

<p>That’s all I’ve got for now; thanks for checking this place out.
<em>Strike the earth!</em></p>]]></content><author><name></name></author><category term="website" /><summary type="html"><![CDATA[General Kenobi! You are a bold one.]]></summary></entry></feed>