<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://www.theinternetvagabond.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.theinternetvagabond.com/" rel="alternate" type="text/html" /><updated>2026-06-18T21:31:24-05:00</updated><id>https://www.theinternetvagabond.com/feed.xml</id><title type="html">The Internet Vagabond</title><author><name>Bill Niblock</name></author><entry><title type="html">A Simple Vagabond’s Thoughts on AI</title><link href="https://www.theinternetvagabond.com/2026/06/18/thoughts-on-ai.html" rel="alternate" type="text/html" title="A Simple Vagabond’s Thoughts on AI" /><published>2026-06-18T00:00:00-05:00</published><updated>2026-06-18T00:00:00-05:00</updated><id>https://www.theinternetvagabond.com/2026/06/18/thoughts-on-ai</id><content type="html" xml:base="https://www.theinternetvagabond.com/2026/06/18/thoughts-on-ai.html"><![CDATA[<h1 id="the-pre-amble-what-inspired-the-motivation-to-write-this-up">The Pre-Amble: What Inspired the Motivation to Write This Up</h1>

<p>I had recently read some posts by Anil Dash: “What do coders do after AI?”
(<a href="https://www.anildash.com/2026/03/13/coders-after-ai/">Link</a>) and “Endgame for
the Open Web” (<a href="https://www.anildash.com/2026/03/27/endgame-open-web/">Link</a>). I
would describe Anil as a techno-optimist; he sees hope in a future where we
aren’t swallowed by the capitalist typhoon of Big Tech. He has several times
voiced that, if we don’t want AI taking over, then we need to take over AI, and
use it for our good, as our tool, to build our communities, and keep the web
open and supportive to all. To me, this feels hypocritical, and those feelings
are because of how the numerous large-language models collectively known as “AI”
have been created. They are systems that have taken everything without consent
or compensation, churned it all up, and actively regurgitate it based on
statistical analysis. They are trained in massive data centers which require
absurd resources, threaten established communities, and continually shatter any
idea of an equal playing field. Data centers are expensive, they require immense
coordination and planning, they are the play-things of the rich and powerful. In
order to train LLMs, you need massive amounts of compute, massive amounts of
data, and many smart people to understand how to shape the training to get the
results desired. These are the purview of corporations, not individuals.</p>

<h3 id="the-first-aside-corporations">(The First) Aside: Corporations</h3>

<p>I have mixed feelings about corporations. I suppose, first and foremost, I don’t
trust anyone is a “good person” (ethically) if their primary ambition is “make
more money.” I, likewise, don’t trust any corporation is a “good company”
(ethically) if they are a for-profit organization. I also don’t trust most
non-profit corporations, because I believe many of them are built on hopes and
dreams, which are fragile at best, and deceptive at worst. Is this fair?
Probably not.</p>

<p>My problem, though, is not (generally) with the corporations <em>themselves</em>, and
certainly not with (most of) the people that work for corporations. My problem
is with how corporations are abused to benefit some at the detriment of others.
That’s the big relevant part.</p>

<h3 id="anyway-back-to-the-main-discussion">Anyway, back to the main discussion.</h3>

<p>Anil mentions in his “Endgame” article that he read and was inspired by an
article by Mike Masnick at Tech Dirt, “AI might be our best bet at taking back
the open web”
(<a href="https://www.techdirt.com/2026/03/25/ai-might-be-our-best-shot-at-taking-back-the-open-web/">Link</a>).
I got maybe a third through it before I decided to jot down these thoughts,
before they evaporate back into the void of my thought-ocean. Mike talks about
how he used agentic AI to build himself some apps he’s always wanted. He waxes
on about how great they are for him, to finally have something built “by him”
for him. He keeps including himself in the process, which I think is a stretch.
Telling someone to build something, even if you have to describe it very well,
doesn’t really feel like you’re the builder. Saying things like, “But the
amazing thing to me is that I keep remembering I can fix anything I come across
that doesn’t work the way I want it to.”, where him “fixing” it is telling the
AI to fix it. This is a form of learned helplessness. He talks about how in the
early days of the Internet he could right-click, copy code, and understand it
and build upon it for his own site, but that how now the technical barriers for
entry are much higher. One cannot “copy-paste” their way to victory when sites
are built on JS frameworks that obscure code, or overly complicate code, or when
that code is centralized and inaccessible at all.</p>

<h3 id="another-aside-copy--paste">Another Aside: Copy + Paste</h3>

<p>Back in the day, you literally could just copy another website’s code (and you
still can today, often) and deploy it yourself. You would obviously have to
change names, and it would run on your domain/service, but you could literally
copy another person’s website as your own. AI can do that too, and generally
using the same mechanism: copying what exists. What’s the difference? Is it the
profit motivation? That certainly bothers me. Is it the scale? Is it the abuse
of power, hammering websites and driving up hosting costs while driving down
traffic, accessibility, and performance? Yes. Would citing sources help? Would
compensation help? I don’t know.</p>

<h3 id="anyway-that-app-development-that-mike-did">Anyway, that “app development” that Mike “did”</h3>

<p>Back to Mike, he mentions using a tool “Lex”, and then, “Over the last few
months, though, I decided to see if I could effectively rebuild that tool
myself, fully controlled by me, without having to rely on a company that might
change or enshittify the app.” This is another area where I get confused.
Building an app using AI doesn’t feel to me like making a tool by oneself, fully
controlled by oneself, without reliance on a company. In fact, it feels exactly
the opposite to me: it is a tool created by forces beyond comprehension, without
one’s insight into how the gears work, without any control by oneself because
they do not understand it. This describes, to me, a black box. Appropriately,
one made by the very companies the article claims we can free ourselves from!</p>

<h1 id="the-amble-introspection-on-ai">The Amble: Introspection on AI</h1>

<p>I’m not a big fan of extreme view-points. After all, only Sith deal in absolutes
(noteworthy for being an absolute statement.) I’m not very involved with AI,
though I have many friends who are. I’ve tried a few (ChatGPT, Claude), I’ve run
local models (via Ollama). I think they are neat. I also think words are
important, and that we use certain words because they have meaning.</p>

<p>It bothers me, in situations like Mike’s, when someone says they built something
with AI. They may have designed it, they may have imagined it, but they for
certain did not build it. There is a bit of Theseus here, sure, and as I said
above I’m not big on absolutes. If you say, “I used AI to help me build
something”, then no you didn’t. You did use AI, but you didn’t build something;
it built the thing. You used AI to make something for you. <em>Words are
important.</em> If something else does the work, that thing built the thing. You
don’t say, “I built a deck this weekend!” if you hired a company to build you a
deck. You say, “I hired a company to build me a deck! It’s super rad!” “But
Bill,” I hear you say, “it’s just short-hand. We all know-“ No, wrong, we
<strong>don’t all know</strong> because you are <em>USING THE WRONG WORDS</em>. Do better, because
it is misleading, intentionally or otherwise.</p>

<h3 id="aside-pedantry">Aside: Pedantry</h3>

<p>Pedants are generally frowned upon. I get it, and as someone who is often
accused of pedantry, I must protest. Mostly because what most folks will call
pedantry is, in fact, just caring about details. (HOW VERY PEDANTIC OF ME).
There’s this revolt against verbosity and clarity that arises sometimes, and
this pervasive argument for ignorance. As if understanding a thing, taking the
time to do so, <em>knowing that thing</em>, is some sort of shame. I think this must be
challenged at every turn. It’s OK to know things, and it’s OK to want to know
things, <em>and it’s OK to give a damn about a thing and demand others give a damn
sometimes too!</em></p>

<p>Don’t be afraid to give a damn, and don’t be afraid to demand that others give a
damn. Things improve when we hold each other accountable, and accept
responsibilities for our environments.</p>

<h3 id="aside-aside-youre-gatekeeping-bill">Aside Aside: You’re Gatekeeping, Bill</h3>

<p>Eh, maybe.</p>

<h3 id="rant-over-still-around">Rant over. Still around?</h3>

<p>I’m jealous of how quickly some folks can leverage AI to generate apps, either
fully-blown, or as proofs-of-concept. I’m one of those “idea guys”, and I have
endless projects I’d love to create. Appropriately, the lack of motivation to
just work on them is the exact same lack of motivation to figure out how to make
an AI build it for me.</p>

<p>I very strongly dislike the fallout around AI. I don’t like that it’s a funnel
of resources from the poor to the rich. I don’t like that it’s being used to
exploit workers. I don’t like the environmental impact. I don’t like the
economic impact. I don’t like how it’s causing certain folks to become
completely dependent and lose the ability to think for themselves
(“deskilling”). Many others have linked to examples of all these things (<a href="https://aphyr.com/posts/411-the-future-of-everything-is-lies-i-guess">here’s
a very thorough
one</a>, and
<a href="https://tante.cc/2026/04/21/ai-as-a-fascist-artifact/">here’s another one</a>;
both are, to sliding degrees, rather anti-AI). I’d say you can search for them,
but Google recently destroyed their search with an AI Summary instead, so add
that to the list.</p>

<p>I both appreciate and dislike the optimism around the future of AI. This is the
one which confuses me. Having a reliable LLM on my phone, that was actually
private, and was actually “open-source” (I’ll get back to this), and was
actually secure, would be nice. A proper “exo-cortex.” That is a future that can
happen. Granted, the way phones are going, this particular LLM would have to be
side-loaded or otherwise implanted onto the device without the blessing of
Mother Corporation.</p>

<h3 id="aside-technologists-vs-the-normies">Aside: Technologists vs The Normies</h3>

<p>Which really brings me to a crux: I’m a technologist. I figure things out,
because I both often have to for work, and I like to. Heck, I manually mod
Oblivion on Linux. That’s… just a pain, sometimes. I do it because I want to,
because I know what the experience of understanding, exploring, and deploying a
successful modded game gets me. I do it because <em>I like to and can spend the
time and money on it.</em> Not everyone can afford to do such like me, nor does
everyone <em>want</em> to. I believe this is something that can be classified as a
privilege.</p>

<p>Let’s hypothetically say local models are a thing. Let’s say there’s a model
that fits my requirements (private/secure/reliable/open/ethically-trained). That
model is not from any of the current AI companies; they already have models
which don’t adhere to these requirements, and those models will
all-but-certainly be used to help craft the local models. Those existing AI
companies are the ones which will exist on consumer devices. Unless you <em>decide
to care enough to change it</em>, and even then, that might not be feasible for
everyone.</p>

<p>A local model that fits my requirements is, therefore, a privileged model. The
<strong>vast majority</strong> of users will not be able or even care to have a private,
secure, reliable, open, and ethically-trained local model. And so, the private
corporate local models will dominate.</p>

<h3 id="maybe-i-shouldve-called-it-the-stumble">Maybe I should’ve called it “The Stumble”</h3>

<p>There’s the low-hanging fruit which I’ve basically stated earlier: I dislike how
modern LLMs have been trained on data which was vacuumed from every available
source without consideration, compensation, or permission. I dislike how much
they lie, how they fabricate information and results. I dislike how they
reinforce bias. I dislike how they can be used as tools of propaganda,
misdirection, abuse, extortion, or any number of other Bad Things (TM).</p>

<p>I’m conflicted with the notion of “open-source” LLMs. It’s certainly not some
silver bullet. It’s also not entirely relevant. Plenty of code for the popular
LLMs is already open-source. The weights for some of them are, too. That doesn’t
answer a lot of the questions that arise, though. It doesn’t answer why certain
answers are provided to questions. Those are the realms of statistics, which
cannot be written in code. It’s like a procedurally-generated game: you can have
the code, and understand where it does the generation, but that code doesn’t
answer <em>why it put certain walls in certain places</em>, it only answers <em>why it
puts walls</em>. In any case, I don’t know enough about the specifics to have a good
feeling either way, so this part hangs in purgatory.</p>

<p>I don’t like how generative AI is impacting artists of all varieties. In my
weekly Pathfinder game, one of the other players spent the entire session having
a model generate a game. It worked (“worked”), and he was so eager to show it
off. He quipped that he could make games faster than I could, and said it wasn’t
that hard to do. I understood it as a tongue-in-cheek remark, and just chuckled.
It still made a point: nothing I do will be valuable to him, because his
black-box can generate something faster, exactly how he wants it. I think it
hurts more when it’s a cast-off remark. I have used a local model to generate
some character art. I’m a horrible artist, just starting to improve with some
pixel art for some games I’m making. I spent a good couple days trying to get
things working, and eventually got something that worked well enough. That same
gaming group will on occasion toss around generated AI images of things that
happened during a session, or of comments made. They can be fun. It’s all a bit
hollow though.</p>

<p>And to follow-up on that: I don’t like how ephemeral generative AI feels. It’s
digital waste-generation at 4000X speed. Those games my friend was generating
during our session (which was, also, incredibly annoying and distracting) will
likely be completely forgotten and discarded by him by the next time we meet.
The art we made in our texts are all just forgotten by now. Though, I actually
think that, if using generative AI wasn’t so harmful to the environment, this
could be one of the things that I liked. This is one of the things it can be
actually useful for: one-off, silly meme-like creations that don’t have
ambitions of profits or fame, and just exist for groups of friends to have fun
with. Maybe this is another purgatory topic.</p>

<p>Oh, and of course: the slop. I don’t need to explore this. It’s bad.</p>

<h1 id="the-vantage-looking-ahead">The Vantage: Looking Ahead</h1>

<p>Recently, there’s been a lot of talk and focus on local models. The ability to
run a comprehensive and capable model locally, disconnected from any cloud
services, on consumer-grade hardware. I mentioned above my requirements:
private, secure, reliable, open, and ethically-trained. Private and secure are
self-explanatory.  Reliable means it doesn’t make shit up. Open means the code,
weights, and data are all available, understood, and verified to be of high
quality, secure, and free (as can be) of defects. Ethically-trained means the
open data was collected with permission, consent, and possibly even
compensation. The model(s) are owned, trained, improved, and distributed as a
community with clear regulation, expectations, and accountability.</p>

<p>Despite my gripes, I think Mike Masnick basically looks at what exists today and
is trying to take steps towards a better tomorrow. Again, <em>words are important</em>,
but his conclusions are reasonable. Anil Dash’s techno-optimism threatens my
cynical views on, well, basically our entire society, and maybe that’s a good
thing.</p>

<p>I think in order for there to be any chance at a better AI future, there must be
regulations established. I also think we need to prepare for a massive economic
shock, as many of the shenanigans these AI-corpos are pulling come to light. I
also think there needs to be information and assistance for “the normies” to use
the technology which actually benefits them.</p>

<p>I don’t think there will be some catastrophic collapse of society (at least, not
due to AI), nor will it bring about some utopia. I think there will be temporary
troubles, as there always are, but I also think that we, as humans, overcome our
adversity and learn to thrive. To paraphrase Sagan: if we do not destroy
ourselves, we’ll be alright. Artists will still art, musicians will still music,
and programmers will still <del>winge on and on</del> program. It will be different,
but it will still be.</p>

<p>What’s my next step then? I think there is a future in local models, and I do
think that’s the way to move forward. I want to do some more research, and learn
how to leverage these models. Then, I want to share my experiences with others.</p>

<h3 id="tldr">TL;DR</h3>

<p>For me, this is how it breaks down:</p>

<ul>
  <li>AI is a thing, it will be a thing, and it’s all-but-certainly here to stay.</li>
  <li>There are some obviously bad things about it: the training data was dubiously
acquired; the models requires extensive resources to train; the companies in
charge are for-profit corporations; the models lie, deceive, and reinforce
bias. Generative slop pollutes the digital realms.</li>
  <li>There are some obviously impressive things about it: generative programming
can help create applications faster, by users less technically inclined;
non-generative uses (summarizing, pattern recognition) are proving incredibly
useful for diagnoses, studying, or learning.</li>
  <li>There are people yelling <strong>VERY LOUDLY</strong> on all sides of the AI argument, and
it is probably worth listening to the various sides, at least briefly, in
order to understand why they are yelling. I don’t have to take a side.</li>
  <li>Local LLMs are likely the best solution, and I need to do more research,
experimentation, and share my findings. I can be a shepherd.</li>
  <li>Local LLMs which meet my criteria will be private, secure, reliable, open, and
ethically-trained. They will be provided by thoughtful and responsible
communities, with proper regulations, and available to the general public in
accessible and simple ways.</li>
  <li>The world likely won’t end, and humanity can thrive, so long as we don’t
destroy ourselves first.</li>
</ul>

<h3 id="the-purgatopics">The Purgatopics</h3>

<ul>
  <li>“Open-Source” LLMs</li>
  <li>Ephemeral creations and “digital waste”</li>
</ul>

<h1 id="be-excellent-to-each-other-party-on">Be excellent to each other. Party on.</h1>

<p>I’m sure there are things I forgot to touch on. Things I’m unaware of, or I got
wrong. If you’ve got any feedback, or want to yell at me, find me on Mastodon and let
me know: <a href="https://mastodon.social/@azulien">@azulien@mastodon.social</a>; or e-mail
me: <a href="mailto:bill@theinternetvagabond.com">bill@theinternetvagabond.com</a>. This is
likely not the only post on this topic, so I’ll post some more as more thoughts
arise.</p>]]></content><author><name>Bill Niblock</name></author><summary type="html"><![CDATA[The Pre-Amble: What Inspired the Motivation to Write This Up]]></summary></entry><entry><title type="html">Life in Progress: January, 2026</title><link href="https://www.theinternetvagabond.com/2026/01/11/life-update.html" rel="alternate" type="text/html" title="Life in Progress: January, 2026" /><published>2026-01-11T00:00:00-06:00</published><updated>2026-01-11T00:00:00-06:00</updated><id>https://www.theinternetvagabond.com/2026/01/11/life-update</id><content type="html" xml:base="https://www.theinternetvagabond.com/2026/01/11/life-update.html"><![CDATA[<h1 id="life-in-progress-january-2026">Life in Progress: January, 2026</h1>
<p>I’ve updated my <a href="/now">now page</a>, reflecting the recent changes.</p>

<h2 id="2025-retrospective">2025 Retrospective</h2>

<p>I’ll start with some of those ambitions I mentioned for the <a href="/2025/01/03/life-update.html">2025
version</a>:</p>

<p>I have played video games! I finished the main story of <strong>Oblivion</strong>, and a few
of its smaller DLCs, but still haven’t finished the two primary DLCs. I decided
to wait for <em>Skyblivion</em>, but it’s been delayed, and so I have also delayed.
Instead, I played through <strong>Fallout 4</strong>!</p>

<p>I made more video games! In May I joined in the <em>Morrowind May Mod Maddness</em>
event, and released <a href="https://www.nexusmods.com/morrowind/mods/56793">The House of
Tides</a> (<a href="https://forge.niblock.tech/game-dev/morrowind-may-mod-merchant">source
code</a>). It’s
incomplete, but I fully plan to continue development. Later, I released my
second Morrowind mod, <a href="https://www.nexusmods.com/morrowind/mods/57664">Riddle Twinlander and the Quest for
Fruit</a> (<a href="https://forge.niblock.tech/game-dev/morrowind-twinlander">source
code</a>). It’s a relatively simple
quest mod, inspired by the Twitch streamer Dridlicious and his play-through of
Two Worlds. Then at the end of the year I released my first project using the
DragonRuby engine, <a href="https://vagabondazulien.itch.io/evacuation">L4-N-DER:
Evacuation</a> (<a href="https://forge.niblock.tech/game-dev/20-second-game-2025">source
code</a>). I had a lot of fun
developing it, and working with DragonRuby! So much so that I’ve started a much
<a href="https://forge.niblock.tech/game-dev/dragonruby-warriors">larger project</a>,
inspired by Musou-games like <em>Dynasty Warriors</em>. That project I look forward to
developing throughout the year, as well as finishing up <em>Evacuation</em> as part of
the <a href="https://itch.io/jam/20ms-game-jam">20-Million Second Game Jam</a>.</p>

<p>I was active, but did not make much progress on my weight-loss goals. I went
golfing almost (or maybe over) 30 times this year, and got my bike out of my
garage for the first time in several years. What an incredible feeling of
mobility! Despite owning a car, with my bike I feel like everything reasonably
nearby is now much more accessible.</p>

<p>I didn’t follow-through on the music goals at all. I still occasionally pick up
my mandolin, or play my piano, but I haven’t established any good practice
habits, nor do I feel have I learned anything.</p>

<p>My personal business is moving sluggishly forward, with a few more clients but
still not enough to be self-sufficient. To that end, I’ve picked-up a part-time
position at a nearby grocer. I appreciate the variety in the work, moving and
stocking produce, and it keeps me active. Since it’s part-time, I rarely work
longer than 4 hours per shift, giving me plenty of time to still work on my
personal business.</p>

<p>And, as you can see from my post history, I have not done really any writing on
this blog. I have done quite a bit of writing for the games I’ve made, and I
have gotten into a habit of journaling, but I haven’t followed-through in
publishing more on the site.</p>

<h2 id="2026-prospective">2026 Prospective</h2>

<p>That’s bring me to now. I was already in the process of forming some goals for
2026 at the end of 2025, and as a result of that, I have 2 concrete goals this
year:</p>

<ol>
  <li>
    <p>Lose Weight</p>
  </li>
  <li>
    <p>Generate Wealth</p>
  </li>
</ol>

<h3 id="lose-weight">Lose Weight</h3>

<p>My specific goal is to lose 50 pounds by August. A friend of mine is getting
married, and I want to look and feel better than ever for it. Losing 50 pounds
will put me roughly at 200 pounds, which will be the least I’ve weighed in over
20 years.</p>

<p>Much of weight loss depends on diet, and to that end I have began tracking my
food again.  I want to eat more whole foods, leafy greens and lean proteins. The
remainder is activity, and I’ve started going to the gym again. My focus will be
on building muscle, and improving my endurance.</p>

<p>Losing weight is a perpetual challenge for me. I find myself feeling defeated
easily in this arena, and so a significant part of this goal will be a constant
reminder of progress and possibility. Every little victory counts!</p>

<h3 id="generate-wealth">Generate Wealth</h3>

<p>While I have some work still to identify the exact value, what I can say for
certain is that I’m not looking to become <em>wealthy</em>, but rather to generate
enough wealth for me to live as I want to. My ambitions are relatively tame by
comparison: I don’t have many, if any, travel goals; I’m very satisfied with
where I live, the clothes I wear, the car I drive, and the foods I eat; I
generally don’t like having “things” around, and prefer a more minimalistic
vibe; and I don’t spend money frivolously. A rough estimate is a net income of
$40-50k.</p>

<p>The first parts of this goal will be better understanding my finances. To that
end, I’m exploring a few approaches that appeal to me, notably what Siddhant
writes about in his <a href="https://sgoel.dev/posts/10-years-of-personal-finances-in-plain-text-files/">recent
article</a>
on personal finances.</p>

<p>Another big part of this goal will be more seriously pursuing my personal
business. The part-time position I have is a nice buffer, but my personal
business will push me over the finish line.</p>

<h3 id="unknown-third-goal-and-others">Unknown Third Goal and Others</h3>

<p>For a while I’ve felt that there’s a third, yet undiscovered goal in the wings.
I’m not sure what it is, though I do have many miscellaneous smaller tasks I
seek to pursue. I want to continue developing games. I want to establish
reliable project planning and management. I want to read more books. I want to
write more, both posts on this blog, and also other projects like tabletop
campaigns or game development concepts. I also want to continue my development
in other software areas, specifically Ruby and Rails. I have several
applications that I would benefit from which can be built in Ruby or Rails. And,
hopefully soon, I will be transition this site from the existing domain to my
new permanent domain, <code class="language-plaintext highlighter-rouge">nibz.dev.</code> There are several changes I look forward to,
and I will be documenting every step of the way.</p>]]></content><author><name>Bill Niblock</name></author><summary type="html"><![CDATA[Life in Progress: January, 2026 I’ve updated my now page, reflecting the recent changes.]]></summary></entry><entry><title type="html">Oblivion on Linux: Lutris Edition</title><link href="https://www.theinternetvagabond.com/2025/01/09/oblivion-lutris.html" rel="alternate" type="text/html" title="Oblivion on Linux: Lutris Edition" /><published>2025-01-09T00:00:00-06:00</published><updated>2025-01-09T00:00:00-06:00</updated><id>https://www.theinternetvagabond.com/2025/01/09/oblivion-lutris</id><content type="html" xml:base="https://www.theinternetvagabond.com/2025/01/09/oblivion-lutris.html"><![CDATA[<h1 id="oblivion-on-linux-lutris-edition">Oblivion on Linux: Lutris Edition</h1>

<p>I love Oblivion. I’ve written before about setting up Oblivion on Linux using
the Steam version, Proton and a handful of aliases: <a href="/2021/11/20/oblivion-linux.html">Part
1</a> covers most of the tooling setup, and <a href="/2021/12/09/oblivion-linux-2.html">Part
2</a> covers some mods I liked. This setup
works, though it is a bit of a hassle to manage. It requires running the tools
individually through aliases from a terminal, which can be intimidating and
unfriendly. It also requires the Steam version of Oblivion.</p>

<p>When I recently decided to return to Cyrodiil and close some gates, I wanted to
review my setup, and also my mod list. I discovered that Wrye Bash now does have
a native Linux application (as does LOOT!). However, I opted to stick with using
Wine and Windows versions of these applications due to a complication of modding
Oblivion in general: the case-sensitive nature of the filesystem. On Linux, the
filesystem is case-sensitive; on Windows, the filesystem is <strong>not</strong>
case-sensitive. For modding, this means if you extract an archive with a
<code class="language-plaintext highlighter-rouge">Data/meshes</code> folder, but your current setup has a <code class="language-plaintext highlighter-rouge">Data/Meshes</code> directory, on
Linux you’ll end up with two directories: <code class="language-plaintext highlighter-rouge">Data/Meshes</code> <em>and</em> <code class="language-plaintext highlighter-rouge">Data/meshes</code>.
There are solutions to this problem on Linux, namely using an EXT-4 filesystem.
I don’t feel like reformatting my disks, and so I’ll let Wine handle it. It may
mean a slight performance hit, but it’s Oblivion - there are <strong>always</strong>
performance hits. If there aren’t performance hits, then you haven’t modded the
game enough yet.</p>

<h2 id="setup-game">Setup: Game</h2>

<p>I’ll be using <a href="https://lutris.net">Lutris</a> to handle installing and launching
the game. No more terminal aliases! I’m also using the <a href="https://www.gog.com/en/game/elder_scrolls_iv_oblivion_game_of_the_year_edition_deluxe_the">GOG version of
Oblivion</a>.
Lutris allows you to link your GOG account, and easily install games using Wine
(or native versions, if available!). In Lutris, I install the game to my
preferred destination, using the default GOG Wine install script. After
installation, I launch the game once to generate some initial configuration
files, and verify things work as expected. Before the next steps, there is a
significant change: the Wine version. In order to use the latest version of Wrye
Bash through Lutris, I had to change the Wine version from my Lutris default,
<em>wine-ge-8-26</em>, to my latest system version, 9.22. There seems to be a Windows
API which Wrye Bash relies upon which isn’t handled well in Wine versions
previous to 9.</p>

<p>Lutris can also install from downloaded GOG installers, without having to link
accounts. Make sure to download all the parts (for Oblivion, there are 3: a
small EXE, and two BIN files). When installing, make sure all the downloaded
files are in the same directory. In Lutris, click the <code class="language-plaintext highlighter-rouge">+</code> button to add a new
game, and select “Install a Windows game from an executable.” Name the game as
you wish, and add identifier
<code class="language-plaintext highlighter-rouge">the-elder-scrolls-iv-oblivion-game-of-the-year-edition-deluxe</code> for the GOG
version. It’ll pull down nice looking images. On the next screen, click the
<code class="language-plaintext highlighter-rouge">Install</code> button next to “Setup file”, choose your desired directory, and then
select the EXE downloaded from the three files above.  Lutris will create the
Wine prefix, and load the GOG Installer. Make note of the directory you chose
above for installation (default will be in the Lutris game library directory,
<code class="language-plaintext highlighter-rouge">Lutris Hamburger Menu</code> -&gt; <code class="language-plaintext highlighter-rouge">Preferences</code> -&gt; <code class="language-plaintext highlighter-rouge">Storage</code> -&gt; <em>Game Library</em>), and
substitute it accordingly below.</p>

<p>Assuming everything is setup and running, the last step here is to note where
Lutris installed the game. The path to the directory will differ, but the
directory structure should be similar to the below. The Lutris “Directory”
(Right-Click -&gt; Configure) value will bring you to the Wine directory (with
<code class="language-plaintext highlighter-rouge">drive_c</code>), and from there will be the <code class="language-plaintext highlighter-rouge">GOG Games</code> directory (or possibly
renamed; this can be changed during the GOG install process), and then the
<code class="language-plaintext highlighter-rouge">Oblivion</code> directory.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Lutris
 |-&gt; gog
  |-&gt; the-elder-scrolls-iv-oblivion-game-of-the-year-edition-deluxe
   |-&gt; drive_c
    |-&gt; GOG Games
     |-&gt; Oblivion
      |- Data
      |- Oblivion.exe
      |- ...
</code></pre></div></div>

<h3 id="xobse">xOBSE</h3>

<ul>
  <li><a href="https://github.com/llde/xOBSE">Project Link</a></li>
  <li><a href="https://www.nexusmods.com/oblivion/mods/37952">Nexus Links</a></li>
</ul>

<p>The Oblivion Script Extender is required for many mods, and should be considered
essential for anything beyond a strict vanilla playthrough. Download the latest
version, and extract it to the <code class="language-plaintext highlighter-rouge">Oblivion</code> directory. When you launch Wrye Bash
(covered next), in the lower-left corner, on the icon bar, should be a green
checkbox.  Hovering over it will notify you that OBSE is enabled. Clicking that
box will toggle OBSE. Generally, make sure it is enabled (checked).</p>

<p>At this point, before any other tools, when you double-click/Play Oblivion, it
will launch the purely vanilla Oblivion that was installed above. To use OBSE,
right-click Oblivion in Lutris, choose <em>Configure</em>, and on the “Game Options”
tab, change the <em>Executable</em> by clicking the button with three dots (labeled
“Select a file”) to <code class="language-plaintext highlighter-rouge">obse_loader.exe</code>. Save the changes, and re-launch.</p>

<h2 id="pre-setup-tools">Pre-Setup: Tools</h2>

<p>Before setting up the modding tools, it is required to run Oblivion once. This
will generate the INI file.</p>

<p>I also recommend adding the Wrye Bash <code class="language-plaintext highlighter-rouge">bash.ini</code> file detailed below before
running Wrye Bash for the first time. By declaring where the executable for
Oblivion is, Wrye Bash won’t try to automatically find it, which can cause some
troubles or confusion.</p>

<h2 id="setup-tools">Setup: Tools</h2>

<p>I’ll be using the following tools. When possible, download the stand-alone
version of the tool. To make things easy, I use the <code class="language-plaintext highlighter-rouge">GOG Games</code> directory for
all the tools.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>drive_c
 |-&gt; GOG Games
  |- BethINI
  |- LOOT
  |- Mods
  |- Mopy
  |- Oblivion
  |- TES4Edit
</code></pre></div></div>

<h3 id="wrye-bash">Wrye Bash</h3>

<ul>
  <li><a href="https://github.com/wrye-bash/wrye-bash">Project Link</a></li>
  <li><a href="https://wrye-bash.github.io/">Homepage</a></li>
  <li><a href="https://www.nexusmods.com/oblivion/mods/22368">Nexus Link</a></li>
</ul>

<p>Mod manager, and <strong>everything else</strong> launcher in this setup. One of the most
exciting results of this setup is handling almost all modding management through
the Wrye Bash UI. From the Project Link, download the stand-alone executable
from the releases. I extract it to the <code class="language-plaintext highlighter-rouge">GOG Games</code> directory, which will create
a <code class="language-plaintext highlighter-rouge">Mopy</code> directory. Within that will be the executable, <code class="language-plaintext highlighter-rouge">Wrye Bash.exe</code>. Next,
in the <code class="language-plaintext highlighter-rouge">Mopy</code> directory, copy the <code class="language-plaintext highlighter-rouge">bash_default.ini</code> file to <code class="language-plaintext highlighter-rouge">bash.ini</code>. Make
the following changes (or replace <code class="language-plaintext highlighter-rouge">bash.ini</code> with this information):</p>

<div class="language-ini highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">[General]</span><span class="w">
</span><span class="c">; -- Path to mod directory.
;    These are relative to the Oblivion directory.
</span><span class="py">sOblivionMods</span><span class="p">=</span><span class="s">..</span><span class="se">\M</span><span class="s">ods</span>
<span class="py">sBashModData</span><span class="p">=</span><span class="s">..</span><span class="se">\M</span><span class="s">ods</span><span class="se">\B</span><span class="s">ash Mod Data</span>
<span class="py">sInstallersData</span><span class="p">=</span><span class="s">..</span><span class="se">\M</span><span class="s">ods</span><span class="se">\B</span><span class="s">ash Installers</span><span class="se">\B</span><span class="s">ash</span>
<span class="w">
</span><span class="c">; -- Path to the Oblivion directory.
;    "C:" here is drive_c on our filesystem.
</span><span class="py">sOblivionPath</span><span class="p">=</span><span class="s">C:</span><span class="se">\G</span><span class="s">OG Games</span><span class="se">\O</span><span class="s">blivion</span>
<span class="w">
</span><span class="c">; -- User directory stuff.
;    "C:" here is drive_c on our filesystem.
;    Make sure to replace YOUR-USERNAME with your username
</span><span class="py">sUserPath</span><span class="p">=</span><span class="s">C:</span><span class="se">\u</span><span class="s">sers</span><span class="se">\Y</span><span class="s">OUR-USERNAME</span>
<span class="py">sPersonalPath</span><span class="p">=</span><span class="s">C:</span><span class="se">\u</span><span class="s">sers</span><span class="se">\Y</span><span class="s">OUR-USERNAME</span><span class="se">\D</span><span class="s">ocuments</span>
<span class="py">sLocalAppDataPath</span><span class="p">=</span><span class="s">C:</span><span class="se">\u</span><span class="s">sers</span><span class="se">\Y</span><span class="s">OUR-USERNAME</span><span class="se">\A</span><span class="s">ppData</span><span class="se">\L</span><span class="s">ocal</span>
<span class="w">
</span><span class="nn">[Tool Options]</span><span class="w">
</span><span class="c">; -- TES4Edit
;    Path is relative to the Oblivion directory.
</span><span class="py">sTes4EditPath</span><span class="p">=</span><span class="s">..</span><span class="se">\T</span><span class="s">ES4Edit</span><span class="se">\T</span><span class="s">ES4Edit.exe</span>
<span class="w">
</span><span class="c">; -- TES4LODGen
;    Path is relative to the Oblivion directory.
</span><span class="py">sTes4LodGenPath</span><span class="p">=</span><span class="s">..</span><span class="se">\T</span><span class="s">ES4LodGen</span><span class="se">\T</span><span class="s">es4LODGen.exe</span>
<span class="w">
</span><span class="c">; -- LOOT
;    Path is relative to the Oblivion directory.
</span><span class="py">sLOOT</span><span class="p">=</span><span class="s">..</span><span class="se">\L</span><span class="s">OOT</span><span class="se">\L</span><span class="s">OOT.exe</span>
</code></pre></div></div>

<p>In this configuration, the relative paths are relative to the <code class="language-plaintext highlighter-rouge">Oblivion</code>
directory (where the game executable is). For all remaining tool setup, modify
the paths in this configuration to match the paths for the tool executable (or,
rename the tool directories, which is what I prefer).</p>

<p>This is where the magic happens: within Lutris, right-click Oblivion and choose
<em>Configure</em>. On the “Game Options” tab, change the <em>Executable</em> by clicking the
button with three dots (labeled “Select a file”), and choose the <code class="language-plaintext highlighter-rouge">Wrye Bash.exe</code>
executable in the <code class="language-plaintext highlighter-rouge">Mopy</code> directory. Save the configuration, and
double-click/Play Oblivion. This time, Wrye Bash will start up (<strong>Remember:</strong>
This will not work on versions of Wine older than 9!).</p>

<p>At this point, when you want to play Oblivion, you will open Lutris, and launch
“Oblivion.” This will launch Wrye Bash. You can then click the Oblivion icon in
the lower-left icon bar to launch the game. As additional tools are configured,
they will appear in the lower-left icon bar (everything except BethINI). To use
the tool, you’ll run it from Wrye Bash.</p>

<h3 id="loot">LOOT</h3>

<ul>
  <li><a href="https://github.com/loot/loot">Project Link</a></li>
  <li><a href="https://loot.github.io/">Homepage</a></li>
</ul>

<p>LOOT handles mod load order. Another application with a native Linux version. I
had previous run into some bugs, but everything looks to work as expected now.
Despite that, I still download and use the stand-alone Windows version (the
archive from the releases, not the EXE). I extract it to my <code class="language-plaintext highlighter-rouge">GOG Games</code>
directory, and rename the directory (or edit the <code class="language-plaintext highlighter-rouge">bash.ini</code> file) so the
executable is where my Wrye Bash configuration expects it.</p>

<p>If setup properly, when you run Wrye Bash, in the lower-left corner will be a
bar full of icons, one of which will be a little treasure chest. Clicking it
will launch LOOT. From there, sort the order, and then close LOOT. Wrye Bash
will refresh, and you can continue on. LOOT will also notify you of any “dirty”
mods, which can be cleaned using TES4Edit (see below).</p>

<h3 id="tes4edit">TES4Edit</h3>

<ul>
  <li><a href="https://github.com/TES5Edit/TES5Edit">Project Link</a></li>
  <li><a href="https://tes5edit.github.io/">Homepage</a></li>
  <li><a href="https://www.nexusmods.com/oblivion/mods/11536">Nexus Link</a></li>
</ul>

<p>I’m still not a mod creator, so my uses of TES4Edit are limited to “quick
cleaning.” From the project page or Nexus, download the latest version, and
extract the archive to the <code class="language-plaintext highlighter-rouge">GOG Games</code> directory. Rename the directory or edit
the <code class="language-plaintext highlighter-rouge">bash.ini</code> file so Wrye Bash can find it; restart Wrye Bash to verify. Wrye
Bash doesn’t include a dedicated short-cut for the “Quick Auto Clean” option,
instead you have to right-click on the TES4Edit short-cut (or the TES4LodGen
short-cut), and choose “Quick Auto Clean”. Choose the mod to clean from the
list, click OK, and let the program do its work.</p>

<h3 id="tes4lodgen">TES4LODGen</h3>

<ul>
  <li><a href="https://github.com/TES5Edit/xLODGen">Project Link</a></li>
  <li><a href="https://tes5edit.github.io/docs/16-xLODGen.html">Homepage</a></li>
  <li><a href="https://www.nexusmods.com/oblivion/mods/15781?tab=description">Nexus Link</a></li>
</ul>

<p>This will generate LOD files ahead of time, allowing for more distant objects to
be shown as you adventure around Cyrodiil. Download the archive, and extract it
to where Wrye Bash expects it, either changing the directory name or updating
the <code class="language-plaintext highlighter-rouge">bash.ini</code> file accordingly. After mod installation is complete, click the
icon from the icon bar to generate the LOD files.</p>

<h3 id="bethini">BethINI</h3>

<ul>
  <li><a href="https://www.nexusmods.com/oblivion/mods/46440">Nexus Link</a></li>
</ul>

<p><code class="language-plaintext highlighter-rouge">BethINI</code> helps manage the “oblivion.ini” file, providing sane options and a
wizard for configuration. This is the only tool that is not run from Wrye Bash.
However, it’s still pretty easy to work with. Download the stand-alone archive,
extract it to the <code class="language-plaintext highlighter-rouge">GOG Games</code> directory.</p>

<p>To run the tool, in Lutris single-click on Oblivion. A bar should appear with
some additional details about Oblivion, including some buttons: one will say
“Play”, and one will look like a wine glass; each will have a small button with
an up-facing arrow. Click the arrow button next to the wine glass button, and
select “Run EXE inside Wine prefix.” Navigate into <code class="language-plaintext highlighter-rouge">drive_c</code>, then <code class="language-plaintext highlighter-rouge">GOG Games</code>,
and into the directory you just set up for BethINI, and select <code class="language-plaintext highlighter-rouge">BethINI.exe</code>.</p>

<p>Wrye Bash does allow for custom application short-cuts, but it requires creating
a Windows shortcut <code class="language-plaintext highlighter-rouge">.lnk</code> file, and I cannot figure out an easier way to do
that than to just run it from Lutris.</p>

<h2 id="post-setup-tools">Post-Setup: Tools</h2>

<p>Verify each tool runs as expected. Conveniently, all the Bethesda DLCs are
“dirty,” so LOOT will notify you, and then you can clean them. Run BethINI,
generate LOD files, and run the game from Wrye Bash. Praise Todd.</p>

<h2 id="mods">Mods</h2>

<p>Wrye Bash on Windows can install mods from an archive, but with this setup that
functionality is unreliable. Instead, I extract the mod archives manually before
installing them with Wrye Bash. For each mod that I want to use, I’ll create a
directory in the <code class="language-plaintext highlighter-rouge">Mods -&gt; Bash Installers</code> directory, and extract the mod
archive into that directory. Then, within Wrye Bash, on the “Installers” tab, I
can install mods as expected.</p>

<p>For actually using Wrye Bash, I recommend <a href="https://www.shrine-of-kynareth.de/wrye-bash-for-beginners-part-1-installation-and-installers-tab">laulajatar’s
guide</a>.
Obviously, you can skip the installation steps for both Wrye Bash and OBSE.
There is also the <a href="https://wrye-bash.github.io/docs/Wrye%20Bash%20General%20Readme.html">Wrye Bash
Manual</a>.</p>

<h2 id="lutris-setup-problems">Lutris Setup: Problems</h2>

<p>The significant problem with this setup is no way to alt-tab away from the game.
To make things even more inconvenient, playing in a windowed mode also doesn’t
work, and shows only a black screen with audio. I haven’t done an exhaustive
trial of options and mods yet to try and fix this, because it isn’t a major
problem to me.</p>

<p>The second inconvenience is as I mentioned above, with Wrye Bash not installing
mods directly from archives. Again, not a major problem to me.</p>

<p>I suspect that both of the problems can be resolved with some Wine tweaks.</p>

<h2 id="lutris-setup-benefits">Lutris Setup: Benefits</h2>

<p>What this setup gets right is ease of use, and ease of replication. All tools
(except BethINI, for now) and the game are run from Wrye Bash. No juggling
multiple application entries, aliases, or special setups. Plus, all tools, mods,
and the game itself are all within the Lutris directory, making multiple setups
a breeze: just copy the directory. In Lutris, you can then duplicate the entry
(Right-Click -&gt; Duplicate), and edit the executable (Right-Click -&gt; Configure -&gt;
“Game options” tab -&gt; <em>Executable</em>) to point to the new directory.</p>

<h2 id="lutris-setup-next-steps">Lutris Setup: Next-Steps</h2>

<p>The most useful next step would be automating this process, by building a Lutris
install script. Also, resolving the alt-tab and windowed problems above.</p>]]></content><author><name>Bill Niblock</name></author><summary type="html"><![CDATA[Oblivion on Linux: Lutris Edition]]></summary></entry><entry><title type="html">Life in Progress: January, 2025</title><link href="https://www.theinternetvagabond.com/2025/01/03/life-update.html" rel="alternate" type="text/html" title="Life in Progress: January, 2025" /><published>2025-01-03T00:00:00-06:00</published><updated>2025-01-03T00:00:00-06:00</updated><id>https://www.theinternetvagabond.com/2025/01/03/life-update</id><content type="html" xml:base="https://www.theinternetvagabond.com/2025/01/03/life-update.html"><![CDATA[<h1 id="life-in-progress-january-2025">Life in Progress: January, 2025</h1>

<p>My <a href="/now">now page</a> is growing too verbose. Instead, I’ll leave that page as a
summary of what this/these page(s) will explore. I’ll start with a retrospective
of 2024, up to now, the beginning of 2025. Maybe a bit of ambitions too.</p>

<h2 id="2024-retrospective">2024 Retrospective</h2>

<p>2024 was a significant year. The most notable change being that I was laid off
in April. The remaining 8 months were quite nice. Before April, the year doesn’t
feel much different or significant. From what I remember, I was stressed,
unhappy, and overall dissatisfied with my situation. I was in the process of
saving money to leave, when I was laid off and paid a generous (enough)
severance. It’s nice when the universe solves problems.</p>

<p>Much of April and May was time spent decompressing. A bit too much drinking,
from what I recall. I began receiving unemployment payments, and looking for
jobs, though only half-heartedly. I was already decided I would start my own
business. I also started my playthrough of <strong>Fallout 3</strong>.</p>

<p>At the end of May, I entered into a game jam, and made my first video game,
<a href="https://vagabondazulien.itch.io/lander">L4-N-DER Training Simulator</a>. One thing
I do remember from the beginning of the year was speaking with some friends
about trying to publish a video game on Itch. I made the game using
<a href="https://fennel-lang.org/">Fennel</a> and the <a href="https://www.love2d.org/">LÖVE 2D game
engine</a>. It was incredibly rewarding, and a great
learning experience. This game would be the first of 5 that I published on my
Itch page this year.</p>

<p>Much of the summer was spent procrastinating starting my own business, and
golfing. At the beginning of summer, in June, my grandmother passed away. She
was about 2 weeks from her birthday, and so we round up and say she lived to 98.
I spent some time helping to clean and clear up her house too. In the beginning
of July I traveled to New York City to see Rezz. I also started properly
exploring WordPress, and working to understand better the business I was still
going to start. Around August, I began playing <strong>Morrowind</strong> for the first time.</p>

<p>In the fall is when I “got serious” about my business. I signed up for the New
York State Self-Employment Assistance Program (SEAP), and through them signed up
with SCORE to speak with a mentor and begin some small business training. I made
my first WordPress site, for a relative (and for free). I also entered into 3
more game jams during this period, publishing
<a href="https://vagabondazulien.itch.io/ticsweeper">TICSweeper</a> (a Minesweeper clone
mde with the TIC-80); <a href="https://vagabondazulien.itch.io/runr">RUNR</a> (another
TIC-80 game); and <a href="https://vagabondazulien.itch.io/escape-the-crash">Escape The
Crash</a>. <em>Escape</em> was based on
some work of mine over the summer to better understand and implement ray-casting
in the TIC-80, which I then translated for use in Fennel and LÖVE. At the end of
fall, my remaining grandmother severely injured herself, placing her in town
through the end of the year. For the second year in a row, much of the holidays
would be spent visiting a rehabilitation center (the same one as my first
grandmother’s). Since the pandemic, I don’t think I’ve had a “normal” holiday
season.</p>

<p>At the end of the year, I formally started my business, <a href="https://www.niblock.tech">Niblock Technology
Solutions</a>, and began working on websites for two
additional clients. Exploring this new world has been exciting, and there are a
lot of new challenges. I love working with others to solve problems, and I’m
looking forward to it. I’m also beginning work on a second business idea for a
game shop. I want to build a community space for people to play games, enjoy
company, and relax. Rounding the year out was my first playthrough of <strong>Deus
Ex</strong>.</p>

<h2 id="now-january-2025">Now: January, 2025</h2>

<p>Now. Plenty of plans and ambitions.</p>

<p>Easiest: I started a playthrough of <strong>Oblivion</strong>. Similar to <strong>Fallout 3</strong> and
<strong>Morrowind</strong>, my goal is to complete the main story and all DLC’s. This time
around, I explored a new modding setup, using <a href="https://lutris.net/">Lutris</a> to
install and manage the game (from GOG), and all the modding tools. For all three
of these games I want to write up a brief retrospective about my experiences and
any of the setup required for playing them on Linux. I already have two articles
for Oblivion (<a href="/2021/11/20/oblivion-linux.html">Part 1</a>, <a href="/2021/12/09/oblivion-linux-2.html">Part
2</a>) detailing using Steam and Proton. I think
the Lutris approach is a bit nicer.</p>

<p><em>Escape The Crash</em> was fun to make, but it’s not done yet. I want to add in a
floor, sound effects, a skybox, and objectives. And an actual ending condition.</p>

<p>Game-making in general I want to continue. I’ve started looking into the
<a href="https://dragonruby.org/">DragonRuby game engine</a>. I also want to learn (more)
Godot. I have no shortage of ideas, only my regular struggles with motivation
and focus.</p>

<p>I’ve fallen into a few bad habits, and my health is worse for them. Its absurdly
easy for me to put on weight, and equally as difficult to lose it again. At my
heaviest I was over 320 pounds, and I’m now at a much better 240. I want to
bring that number down to 200, but I also want to remove as much significance
from that number as I can. It should be a metric, not a grade.</p>

<p>I’ve also set for myself several music goals. I want to get better at
sight-reading, and so I have a goal to read a new piece of music each week. I
also want to explore music production, and try making my own 45-60 minute mix.</p>

<p>There are the business goals. I need to have an income that supports my
lifestyle, which means more clients and (hopefully) more businesses!</p>

<p>Finally, I want to write more. I think about writing, but rarely follow-through.
As all my other ambitions develop, sharing them with the world will help me
formally catalog my successes. Plus, if I have something useful and helpful to
share, then I want to!</p>]]></content><author><name>Bill Niblock</name></author><summary type="html"><![CDATA[Life in Progress: January, 2025]]></summary></entry><entry><title type="html">Life in Progress: September, 2024</title><link href="https://www.theinternetvagabond.com/2024/09/24/life-in-progress-september.html" rel="alternate" type="text/html" title="Life in Progress: September, 2024" /><published>2024-09-24T00:00:00-05:00</published><updated>2024-09-24T00:00:00-05:00</updated><id>https://www.theinternetvagabond.com/2024/09/24/life-in-progress-september</id><content type="html" xml:base="https://www.theinternetvagabond.com/2024/09/24/life-in-progress-september.html"><![CDATA[<h1 id="life-in-progress-as-of-2024-09-24">Life In Progress, as of 2024-09-24</h1>

<ul>
  <li>New hardware: laptop, phone, and NAS</li>
  <li><strong>TWO</strong> game jams!</li>
  <li>Finishing up Morrowind</li>
  <li>SEAP/Self-Employment Progress</li>
</ul>

<h2 id="new-hardware">New Hardware</h2>

<h3 id="framework-laptop">Framework Laptop</h3>

<p>This new <a href="https://frame.work">Framework</a> is great! I’ve only had it for a few
weeks, but it is wonderful. I’ve been slowly sync’ing and migrating workflows
from my various existing options to it.  Being able to work for multiple hours
without worrying about battery life is nice.</p>

<p>Previously, the Chromebook I have was my go-to remote personal macine.
Considering its age, and the inherent limitations of a Chromebook, it served me
better than I ever could have hoped. However, I knew it’s time was drawing
near, and the Dell I got as part of my work severance was not going to cut it.
Considering I’m starting a business doing technology, I needed a reliable,
“all-day” machine with Linux. The ARM-based Macs are incredibly tempting, but
I am not a fan of Mac. I’ve been eyeing Framework for a bit now, and their
newest 13-inch model with AMD components checked enough of the boxen for me to
dive in.</p>

<h3 id="phone">Phone</h3>

<p>For a while I’ve been eyeing Mint Mobile. In the US, they have a plan offering
unlimited text and talk, plus 5 GB of data, for $15 per month. I generally use
less than 1 GB of streaming data, so this seemed like a clearly better option
than the $30+ I was paying for Google Fi. When I decided to switch, they had an
incredible deal offering a Google Pixel 9 plus a year’s service for a great
price, so I not only switched carrier, I also snagged a new phone! I had a
Samsung S21, which was more than sufficient for my needs, so switching isn’t
quite as significant as with the laptop, but it’s still a nice new experience.
The OS and environment on the Pixel is much nicer than Samsung phones, so
that’s quite the plus!</p>

<h3 id="nas">NAS</h3>

<p>I bought a 2-bay Synology NAS from a friend a few months ago, and with the
myriad other changes, decided to set it up proper. I setup
<a href="https://www.navidrome.org/">Navidrome</a> for audio, and <a href="https://jellyfin.org/">Jellyfin</a> for video. I had previously used Navidrome, then
switched to Jellyfin for both audio and video, but with the new phone comes a
return to form. I like <a href="https://gitlab.com/ultrasonic/ultrasonic">Ultrasonic</a>,
and Navidrome plays nicely with it.</p>

<p>The other big additions with the NAS is more backup scripts, and also pulling
down some YouTube series I like for local copies. More details in a full post.</p>

<h2 id="game-making">Game Making</h2>

<p>Two game jams! One for the entire month of September, <a href="https://itch.io/jam/clone-jam-game-a-month">Clone
Jam</a>, and a
<a href="https://itch.io/jam/mini-jam-167-cyber">Mini-Jam</a>. For the Clone Jam, I was
working on building a ray-casting-based dungeon scavenger, similar to “Legend
of Grimrock”, but with less combat. However, while I have made great progress
understanding how ray-casting works, and how to implement it, I won’t have time
to finish such a game. That knowledge won’t go to waste, though! There’s a
game-jam at the end of October where I intend to make use of it. Instead, I’ll
be touching-up and submitting a clone of Minesweeper I made:
<a href="https://vagabondazulien.itch.io/ticsweeper">TICsweeper</a>.</p>

<p>For the Mini-Jam, I decided to make a “runner” type game: you maneuver your
sprite to collect and/or avoid certain projectiles. I also made this game in
the <a href="https://tic80.com">TIC-80</a>. While I didn’t pull any all-nighters, focusing
on a single project for 72-hours with as little down-time as possible is still
quite exhausting! My submission was called
<a href="https://vagabondazulien.itch.io/runr">RUNR</a>. It ranked 48th out of 66
submissions, which is honestly disappointing, but not enough to demotivate me
from continuing my game-making journey!</p>

<h2 id="game-playing">Game Playing</h2>

<p>I finally finished my play-through of Morrowind, and one of its two expansions,
Tribunal. (Note: before “DLC”, new game content for existing games was
distributed like the game itself, on a piece of data-storing media, such as a
CD. These were called “expansion packs.”) I have thoroughly enjoyed my time in
The Elder Scrolls III, and I definitely understand why many claim it as their
favorite. I will talk more about my experience in a full post, just like I did
for my recent Fallout 3 replay (I mean, just like I <em>will</em>. I <em>WILL!</em>)</p>

<h2 id="business-time">Business Time</h2>

<p>Alas, while game making and playing are great uses of my time, they do not get
me the resources I need to pay my bills. I continue to work on starting my own
business. I’ve met with two mentors, one business and one technology, to help
get me started and provide guidance. In fact, this week marks what I would
consider the proper beginning of my business. With some dedication, I’ll have
more exciting news to share about this next time!</p>

<h2 id="thats-all-for-now">That’s All For Now!</h2>

<p>I think the original intention of a “Now” page is to be less verbose, but I
find the monthly cadence of a somewhat comprehensive update to be more
appealing! Until next month!</p>]]></content><author><name>Bill Niblock</name></author><summary type="html"><![CDATA[Life In Progress, as of 2024-09-24]]></summary></entry><entry><title type="html">Life in Progress: August, 2024</title><link href="https://www.theinternetvagabond.com/2024/08/19/life-in-progress-august.html" rel="alternate" type="text/html" title="Life in Progress: August, 2024" /><published>2024-08-19T00:00:00-05:00</published><updated>2024-08-19T00:00:00-05:00</updated><id>https://www.theinternetvagabond.com/2024/08/19/life-in-progress-august</id><content type="html" xml:base="https://www.theinternetvagabond.com/2024/08/19/life-in-progress-august.html"><![CDATA[<h1 id="life-in-progress-as-of-2024-08-19">Life In Progress, as of 2024-08-19</h1>

<ul>
  <li>Learning <a href="https://www.youtube.com/watch?v=LZVpvJsqTMM">Stan Rogers’
<em>Bluenose</em></a> on mandolin and voice</li>
  <li>Building a few games in the <a href="https://tic80.com">TIC-80 fantasy console</a></li>
  <li>Deploying my own <a href="https://codeberg.org/Codeberg/pages-server/">“Pages” server</a></li>
  <li>Building a Forgejo Action for deploying game builds to Itch.io using
<a href="https://itch.io/docs/butler/">butler</a></li>
  <li>Building a custom WordPress Docker container that uses SQLite</li>
  <li>Starting my own business</li>
</ul>

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

<p>Adam and I continue our semi-weekly jam sessions! We’ve settled on <a href="https://www.youtube.com/watch?v=LZVpvJsqTMM">Stan Rogers’
<em>Bluenose</em></a> for our first piece. I
normally pick up lyrics pretty quick, but this song eludes me. We worked on the
chord progression last week, and I’ve been actually practicing!</p>

<h2 id="game-dev">Game Dev</h2>

<p>Still having a blast with <a href="https://tic80.com/">TIC-80</a>.  I made a small farming
experiment game, to learn <a href="https://fennel-lang.org">Fennel</a>  some more and also
nail-down some basic design principles. Some of the ideas in that experiment,
namely generating the map with a loop and <code class="language-plaintext highlighter-rouge">mset</code> instead of using the built-in
map designer, gave me some insight for solving my darkness troubles in
Nightgolf. I’m still wrapping my head around it, but I think this will be a
solution.</p>

<p>The farming experiment game lives on
<a href="https://vagabondazulien.itch.io/farm-experiment-1">Itch.io</a> and the <a href="https://tic80.com/play?cart=3965">TIC-80
Webzone</a>.</p>

<h2 id="tech-dev">Tech Dev</h2>

<p><a href="https://forgejo.org/">Forgejo</a> continues to be rewarding, and I’m looking
forward to expanding my deployment of it by deploying my own <a href="https://codeberg.org/Codeberg/pages-server/">“Pages”
server</a>.  This will allow me to
deploy my static sites on my own infrastructure. I’m also working on an “Action”
for leveraging <a href="https://itch.io/docs/butler/">butler</a> to publish games I publish
the source code for from my Forge to Itch.io.</p>

<p>In preparation for both my own use, and my business use, I need to learn more
about Nextcloud. I’m also working on building a custom WordPress Docker
container that relies on SQLite instead of MySQL.</p>

<p>Hovering about all this is backups and monitoring, both of which I sprinkle into
my learning voyage. I’m looking forward to writing up some documentation about
my implementation.</p>

<h2 id="entrepreneurship">Entrepreneurship</h2>

<p>I’m happy to report I was accepted into New York’s Self-Employment Assistance
Program, <a href="https://dol.ny.gov/SEAP">SEAP</a>. I will be starting a business offering
managed online services, such as website design and deployment, personal cloud,
and email. I would like to offer these services to local small businesses and
not-for-profits. I think of it as “Silicon Valley experience” at reasonable,
local prices. I’m excited to dive into the parts I’m not very familiar with,
namely the business side of things. I have extensive technical experience and
mastery, but I lack any significant business experience.</p>

<h2 id="gaming">Gaming</h2>

<p>I’ve started a new playthrough of <a href="https://en.wikipedia.org/wiki/Darkest_Dungeon">Darkest
Dungeon</a>.  It’s mildly
frustrating, but mostly fun. I have fun yelling at the game; it’s like stress
relief. I’ve been generally successful, but the Crimson Court has been very
rough to me. It is a game about challenges and loss, though, so nothing
unexpected.</p>

<p>I’ve continued my play-through of
<a href="https://en.wikipedia.org/wiki/Sundered">Sundered</a>, though have put it down for
a bit. I’m playing it on my Steam Deck using <a href="https://lutris.net/">Lutris</a>, and
it works very well. Lutris continues to impress me, and I want to try writing an
installer for a game.</p>]]></content><author><name>Bill Niblock</name></author><summary type="html"><![CDATA[Life In Progress, as of 2024-08-19]]></summary></entry><entry><title type="html">Automatic Backups with RClone, systemd, and Backblaze</title><link href="https://www.theinternetvagabond.com/2023/05/07/rclone-backups.html" rel="alternate" type="text/html" title="Automatic Backups with RClone, systemd, and Backblaze" /><published>2023-05-07T00:00:00-05:00</published><updated>2023-05-07T00:00:00-05:00</updated><id>https://www.theinternetvagabond.com/2023/05/07/rclone-backups</id><content type="html" xml:base="https://www.theinternetvagabond.com/2023/05/07/rclone-backups.html"><![CDATA[<h1 id="automatic-backups-with-rclone-systemd-and-backblaze">Automatic Backups with RClone, systemd, and Backblaze</h1>

<h2 id="quick-note">Quick Note</h2>

<p>Backups are not complicated. They may seem like it, but in reality the
complications arise from restoration. If you’re not doing anything fancy with
your data now, then don’t do anything fancy with your backups. Follow the 3-2-1
methodology: 3 copies of (important) data, in 2 different locations, 1 of which
is off-site. Many others have written about this in better detail than I ever
can; Jeff Geerling has a great article and several videos about it <a href="https://www.jeffgeerling.com/blog/2021/my-backup-plan">on his
site</a>. The time (and
often money) investment now can reduce worry, stress, and loss should the data
you care about ever become unusable.</p>

<p>(There are no affiliate links in this post, nor was I paid to recommend any
product or service.)</p>

<h1 id="my-needs">My Needs</h1>

<p>Backups are as important as the data you have. If all you’ve got is a directory
full of meme GIFs that you don’t mind losing, then backups may be a waste of
time and money. I have recently taken to buying as much of my music as possible
(especially through Bandcamp, and especially on Bandcamp Fridays!). While much
of the music I buy does exist on a remote server at a company somewhere, the
cost of having to re-download and re-organize all of it well outweighs the cost
of proper backups. Not to mention the music which I can’t get anywhere else
anymore. Nor to further mention the other data which I have. All of this is to
say: backups are worth it to me.</p>

<p>Recently I wanted to setup NFS on my home network. I was concerned about messing
something up, and erasing the directory I had intended to share, so I wanted to
backup the data. For a while I’ve been intending to setup backups (as everyone
probably does), but it was never a priority. This project helped to prioritze
it. I had read about <a href="https://rclone.org/">RClone</a>, a command-line utility for
interacting with an incredible number of cloud services. I messed around a bit
with it, found it to my liking, and started shopping around for a cloud storage
solution. Enter <a href="https://www.backblaze.com/">Backblaze</a>. The folks that publish
all those hard-drive stats? Turns out they also run a business where they
provide cloud storage. It’s inexpensive, reliable, and straight-forward. The
last step was to automate it with systemd timer units.</p>

<h2 id="backblaze-setup">Backblaze Setup</h2>

<ul>
  <li><a href="https://www.backblaze.com/">Backblaze Site</a></li>
  <li><a href="https://www.backblaze.com/help.html">Backblaze Docs</a></li>
</ul>

<p>First step is to setup Backblaze. Create an account, verify email address, all
that jazz. I’d recommend enabling multi-factor authentication on the
<strong>Account</strong> -&gt; <strong>My Settings</strong> page, under <strong>Security</strong>. Next, click on the 
<strong>Account</strong> -&gt; <strong>Application Keys</strong> page, and generate a new key. Fill in the
blanks (I gave my key full access to all buckets), copy the important bits, and
store them somewhere safe (like your password vault).</p>

<h2 id="rclone-setup">RClone Setup</h2>

<ul>
  <li><a href="https://rclone.org/">RClone Site</a></li>
  <li><a href="https://rclone.org/b2/">RClone Backblaze B2 Page</a></li>
</ul>

<p>Download and install RClone. Next run <code class="language-plaintext highlighter-rouge">rclone config</code> and walk through the
prompts. I’m using Backblaze, so I select “Backblaze B2” as my storage backend.
Then I add the application key ID and application key secret (key) at the
relevant prompts. For all of this configuration, I named the remote “backblaze”,
though a shorter name can make commands easier. Regardless, verify the
configuration is setup properly by running <code class="language-plaintext highlighter-rouge">rclone lsd backblaze:</code>, which will
list buckets. Unless a bucket was already configured, nothing will show up, and
also there won’t be any errors.</p>

<h2 id="backup-configuration">Backup Configuration</h2>

<p>Now, figure out how you want to backup your data. I have a <a href="/2020/06/14/setting-up-btrfs.html">BTRFS RAID setup
with multiple sub-volumes</a>, each for a
different data type: one for Books, one for Music, and so on. Since creating a
bucket doesn’t cost anything, I decided to split my backups similarly. I created
the buckets I wanted, and did a “manual” RClone sync of the data.</p>

<p><code class="language-plaintext highlighter-rouge">rclone sync --fast-list --transfers 20 /path/to/Books
backblaze:bucket-for-Books-backups</code></p>

<p>The “–fast-list” and “–transfers” options are specified on the <a href="https://rclone.org/b2/">RClone
Backblaze B2 page</a>, along with some others that may be
of interest.</p>

<p>At this point, my data was “backed-up”, and I could muck about with it more
confidently. Also, at this point, configuring back-ups is done. Run those RClone
sync commands once a week, and all is set. I don’t want to remember to do
things, though.</p>

<h2 id="automating-the-process">Automating the Process</h2>

<p>The first thing to do is create a user-agnostic location for the configuration
file and some additional files. I chose <code class="language-plaintext highlighter-rouge">/etc/rclone</code>, and copied the RClone
configuration file generated previously to this directory as <code class="language-plaintext highlighter-rouge">backblaze.conf</code>.</p>

<p>Next, I created a filter file. RClone has extensive <a href="https://rclone.org/filtering/">filtering
options</a>. For my current needs, a single file
will suffice.</p>

<h3 id="defaultfilter">default.filter</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Exclude BTRFS snapshot directories
- .snapshots/**
# Exclude Syncthing configuration directories
- .stfolder/**
</code></pre></div></div>

<p>systemd timer units ( [<a href="https://wiki.archlinux.org/title/Systemd/Timers">Arch
Wiki</a>]
[<a href="https://man.archlinux.org/man/systemd.timer.5">Manual</a>] ) are triggers that
activate on a schedule. That schedule can be dynamic (relative to a
previous/other trigger), or static (at 6:15 every day). A timer unit triggers a
service unit, which does the work. For my backups, I decided to run a sync every
hour, at sometime between the 15 and 45 minute mark of that hour. To simplify
having multiple timer units that all do the same thing, I setup a template unit
(see the <strong>Note</strong> here: <a href="https://wiki.archlinux.org/title/Systemd#Using_units">Arch
Wiki</a>).</p>

<h3 id="rclone-backuptimer">rclone-backup@.timer</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Unit]
Description=RClone Backup Timer Template

[Timer]
# Run every hour, sometime between the 15 minute and 45 minute mark
OnCalendar=*-*-* *:15:00
AccuracySec=30min
RandomizedDelaySec=5min

# The %i is whatever value is after the "@" for the configured unit. For
# example, rclone-backup@Books.timer will run the rclone-backup@Books.service
Unit=rclone-backup@%i.service

[Install]
WantedBy=timers.target
</code></pre></div></div>

<p>Then I can <code class="language-plaintext highlighter-rouge">enable</code> and <code class="language-plaintext highlighter-rouge">start</code> a timer for each directory to backup. To
minimize configuration, I also setup the service file to be a template. This
requires a bit of inflexible coordination: the directory name must match to a
part of the bucket name.</p>

<h3 id="rclone-backupservice">rclone-backup@.service</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Unit]
Description=RClone Backup of %I

[Service]
Type=simple
ExecStart=/usr/bin/rclone sync -v --config "/etc/rclone/backblaze.conf" --fast-list --transfers 20 --filter-from "/etc/rclone/default.filter" /path/to/%i/ backblaze:bucket-for-%i-backups
</code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">--config</code> option allows us to specify the configuration in the <code class="language-plaintext highlighter-rouge">/etc</code>
directory. I include <code class="language-plaintext highlighter-rouge">-v</code> to have some additional output in the journal.
Again, <code class="language-plaintext highlighter-rouge">--fast-list</code> and <code class="language-plaintext highlighter-rouge">--transfers</code> are used to speed up the process and keep
costs lower. Then I <code class="language-plaintext highlighter-rouge">--filter-from</code> the “default.filter” file.</p>

<p>Place each of these files (<code class="language-plaintext highlighter-rouge">rclone-backup@.timer</code> and <code class="language-plaintext highlighter-rouge">rclone-backup@.service</code>)
into <code class="language-plaintext highlighter-rouge">/etc/systemd/system</code>. For each directory, enable and start the timer
unit; <code class="language-plaintext highlighter-rouge">systemctl enable rclone-backup@Example.timer</code> and <code class="language-plaintext highlighter-rouge">systemctl start
rclone-backup@Example.timer</code> will backup <code class="language-plaintext highlighter-rouge">/path/to/Example/</code> to the
<code class="language-plaintext highlighter-rouge">bucket-for-Example-backups</code> bucket.</p>

<h1 id="next-steps">Next Steps</h1>

<p>I would like to get some sort of metrics and dashboards setup to track backup
status and statistics. It could be very useful to be notified if a backup ever
fails.</p>

<p>Eventually, I’ll upload this to a repository somewhere for ease of access and
backup. When I do, I’ll update this post.</p>]]></content><author><name>Bill Niblock</name></author><summary type="html"><![CDATA[Automatic Backups with RClone, systemd, and Backblaze]]></summary></entry><entry><title type="html">Funkwhale on Linode with Object Storage</title><link href="https://www.theinternetvagabond.com/2022/09/27/linode_funkwhale.html" rel="alternate" type="text/html" title="Funkwhale on Linode with Object Storage" /><published>2022-09-27T00:00:00-05:00</published><updated>2022-09-27T00:00:00-05:00</updated><id>https://www.theinternetvagabond.com/2022/09/27/linode_funkwhale</id><content type="html" xml:base="https://www.theinternetvagabond.com/2022/09/27/linode_funkwhale.html"><![CDATA[<h1 id="funkwhale-on-linode-with-object-storage">Funkwhale on Linode with Object Storage</h1>

<h2 id="funkwhale-setup">Funkwhale Setup</h2>

<p><a href="https://funkwhale.audio/">Funkwhale</a> is a decentralized music service,
connecting to the <a href="https://en.wikipedia.org/wiki/Fediverse">fediverse</a> using the
ActivityPub protocol. It is a web-based application, allowing users to upload,
listen, and share music and podcasts. I think it’s a cool project, and I can
self-host it, so I did. For a while, Funkwhale offered an all-in-one Docker
container, but they shifted focus to a multi-container approach. I had delayed
my transition from all-in-one to multi-container, but finally this past weekend
I found myself with time and motivation to get it done. The installation of
Funkwhale using Docker is very straight forward. The community has developed a
series of templates that can be fetched, modified, and used to get started very
quickly and easily. Those instructions are
<a href="https://docs.funkwhale.audio/installation/docker.html#multi-container-installation">here</a>.
The only significant modification I made was using <code class="language-plaintext highlighter-rouge">/opt/funkwhale</code> as my
default data and media root. I keep all my Docker configuration in directories
in my home directory as well. Much of these changes can be established in the
<code class="language-plaintext highlighter-rouge">.env</code> file discussed in the installation instructions, but I also scrubbed the
template files created and used during installation to make sure the directories
were as I wanted them. I also proxy Funkwhale and many other services behind
nginx, and there were a few <a href="https://docs.funkwhale.audio/installation/index.html#nginx">additional
steps</a> I had to
take. With all that complete, I had transitioned successfully. I already had SSL
certificates, but if that’s also a requirement, they can easily be provisioned
using <a href="https://certbot.eff.org/">Certbot</a>.</p>

<h2 id="object-storage-setup">Object Storage Setup</h2>

<p>In my old setup, I leveraged Funkwhale’s ability to <a href="https://docs.funkwhale.audio/admin/importing-music.html">in-place import
music</a>. I transferred
about 70GB worth of music to my VPS (using Syncthing &lt;3), filling the disk
almost entirely (<em>98%</em>).  It was a temporary solution for a road trip, and I
knew I couldn’t keep it that way for long. Funkwhale has the ability to leverage
S3-compatible object storage, and Linode, the provider I already use for my VPS,
offers object storage. Any of the other major cloud providers will also do the
trick; I just went with what was easiest. On the Linode side, there’s not much
to it. I created a new bucket, labeled it accordingly, created an access key,
and that was it. The Funkwhale side proved to be a bit challenging, but not, it
turns out, due to configuration. Well, <em>technically</em> it was.</p>

<p>The relevant configuration options on the Funkwhale side, in the <code class="language-plaintext highlighter-rouge">.env</code> file:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>## External storages configuration
# Funkwhale can store uploaded files on Amazon S3 and S3-compatible storages (such as Minio)
# Uncomment and fill the variables below

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_STORAGE_BUCKET_NAME=
# An optional bucket subdirectory were you want to store the files. This is especially useful
# if you plan to use share the bucket with other services
# AWS_LOCATION=

# If you use a S3-compatible storage such as minio, set the following variable
# the full URL to the storage server. Example:
#   AWS_S3_ENDPOINT_URL=https://minio.mydomain.com
AWS_S3_ENDPOINT_URL=

# If you want to serve media directly from your S3 bucket rather than through a proxy,
# set this to false
# PROXY_MEDIA=false

# If you are using Amazon S3 to serve media directly, you will need to specify your region
# name in order to access files. Example:
#   AWS_S3_REGION_NAME=eu-west-2
# AWS_S3_REGION_NAME=

# If you are using Amazon S3, use this setting to configure how long generated URLs should stay
# valid. The default value is 3600 (60 minutes). The maximum accepted value is 604800 (7 days)

# AWS_QUERYSTRING_EXPIRE=

# If you are using an S3-compatible object storage provider, and need to provide a default
# ACL for object uploads that is different from the default applied by boto3, you may
# override it here. Example:
#    AWS_DEFAULT_ACL=public-read
# Available options can be found here: https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#canned-acl

AWS_DEFAULT_ACL=
</code></pre></div></div>

<p>I’ve included the comments. The entire file is commented, and generally easy
enough to figure out. On the Linode side, when I generated the access key, it
provided me an <em>Access Key</em> and a <em>Secret Key</em>. I had already created a bucket,
and so I had the <em>Bucket Name</em>. The challenge for me was what the <em>Endpoint URL</em>
was, and if I needed to set a <em>Region Name</em> and <em>ACL</em>. Linode’s documentation on
their object storage offering is a bit anemic, and so I made use of their setup
instructions for <a href="https://www.linode.com/docs/products/storage/object-storage/guides/s3cmd/">using s3cmd with Linode object
storage</a>.
From this guide, I was able to both setup <code class="language-plaintext highlighter-rouge">s3cmd</code>, and also determine what the
<em>Endpoint URL</em> would be. I also set the <em>Region Name</em> and <em>ACL</em> to match what
the UI was showing, but I’m still not certain their necessary. Here’s the trick,
and the cause of a few hours-worth of confusion: restarting the Docker
containers wasn’t re-reading the <code class="language-plaintext highlighter-rouge">.env</code> file; I had to completely stop and
re-create them. It wasn’t until I ran <code class="language-plaintext highlighter-rouge">docker inspect funkwhale-docker_api_1</code>
and noticed the environment variables weren’t set that I figured this out. Could
be this is common knowledge for Docker-gurus; now I know. With the
configuration in place, and the containers recreated, I was able to upload files
through Funkwhale, and watch them be stored in my Linode bucket. My final
configuration options were as follows:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>AWS_ACCESS_KEY_ID=&lt;stuff&gt;
AWS_SECRET_ACCESS_KEY=&lt;secret stuff&gt;
AWS_STORAGE_BUCKET_NAME=funkwhale-music-bucket-name
AWS_S3_ENDPOINT_URL=https://us-southeast-1.linodeobjects.com
AWS_S3_REGION_NAME=us-southeast-1
AWS_DEFAULT_ACL=public-read
</code></pre></div></div>

<h2 id="next-steps">Next Steps</h2>

<p>The downside of Funkwhale’s S3-compatible object storage integration lies in how
files are uploaded. One cannot simply <del>walk into</del> upload files to the bucket;
music must be uploaded through Funkwhale’s API (via web or other means), and
then Funkwhale stores it accordingly (like for local uploads). I have a lot of
music, and I can’t be asked to manually upload it all. That’s, like, 2 hours of
half-hearted work. No, instead, the obvious solution is to build a script that
can automatically upload any new music from my local music directory to
Funkwhale automatically. What I’m considering now is how I want to do that. I
could leverage systemd to watch my local music directory, and run the upload
script whenever new music is uploaded. Could even expand it to remove music
whenever I delete it locally, though that seems a bit odd. I could instead setup
a cron or systemd-timer to run at a set interval, and check for any new files
since the last run, and upload them. Regardless of the trigger, the upload
functionality should ideally avoid duplicates, run in a non-blocking fashion,
maybe batch upload files, and be low impact on my desktop. So that’s next.</p>]]></content><author><name>Bill Niblock</name></author><summary type="html"><![CDATA[Funkwhale on Linode with Object Storage]]></summary></entry><entry><title type="html">Setting up Syncthing on the Steam Deck (Updated!)</title><link href="https://www.theinternetvagabond.com/2022/07/04/steam_deck_syncthing.html" rel="alternate" type="text/html" title="Setting up Syncthing on the Steam Deck (Updated!)" /><published>2022-07-04T00:00:00-05:00</published><updated>2022-07-04T00:00:00-05:00</updated><id>https://www.theinternetvagabond.com/2022/07/04/steam_deck_syncthing</id><content type="html" xml:base="https://www.theinternetvagabond.com/2022/07/04/steam_deck_syncthing.html"><![CDATA[<h1 id="syncthing-on-the-steam-deck-updated">Syncthing on the Steam Deck (Updated!)</h1>

<h2 id="update">Update</h2>

<p>Turns out, when you update the SteamOS, it completely over-writes the operating
system. All of the setup I had originally written was great, if I never update,
which is unacceptable. Not all is lost; the quest simply gets harder. If I can’t
rely on system-wide services, then I rely on user services.</p>

<h3 id="the-wrong-way-system-wide-services">The Wrong Way: System-Wide Services</h3>

<p>My first attempt was to setup Syncthing as a system-wide service managed by
<code class="language-plaintext highlighter-rouge">systemd</code>, installed via <code class="language-plaintext highlighter-rouge">pacman</code>. There are several problems with this. First,
it requires disabling the read-only file-system. Next, <code class="language-plaintext highlighter-rouge">pacman</code> is not setup nor
reliable, since every SteamOS update will over-write any changes I make to any
of the read-only file-system, including the directories that <code class="language-plaintext highlighter-rouge">pacman</code> relies on.
Related, the update will also erase the Syncthing package. This means I either
never update (inadvisable, and unacceptable), or I setup Syncthing not in the
read-only file-system.</p>

<h3 id="the-right-way-user-services">The Right Way: User Services</h3>

<p>systemd allows for non-root-based services, called user services. The Arch Wiki
<a href="https://wiki.archlinux.org/title/Systemd/User">systemd/User</a> article describes
this functionality much more than I will. Here are the relevant details:</p>

<ul>
  <li>User services can be enabled to start when a user logs in</li>
  <li>Service files are stored in the user’s home directory (specifically
  <code class="language-plaintext highlighter-rouge">~/.config/systemd/user</code>)</li>
  <li>No root privileges are required. No modifying the read-only file-system</li>
</ul>

<h2 id="syncthing">Syncthing</h2>

<p>Syncthing is incredible. I’ve <a href="2020/07/19/syncthing-part-1.html">written about it
before</a>, but the setup here is a bit more
involved. The Steam Deck runs Arch Linux (and have I told you yet today that I
do too?), so the Arch Wiki <a href="https://wiki.archlinux.org/title/Syncthing">article on
Syncthing</a> gives some good insight.
When I initially started this process, I installed the SyncthingGTK application
from the Discover Store. This means it is a Flatpak application, and so doesn’t
require elevated user privileges. I also tried the Syncthingy application, which
explicitly calls out Steam Deck users. However, both require running the Flatpak
in the background (like some users do for Discord or Spotify). I don’t like
this, it feels off, and thus I sought a different approach.</p>

<h2 id="sshd-still-incredibly-useful">SSHD: Still Incredibly Useful</h2>

<p>I got real tired real quick of using the on-screen keyboard. After
complaining, a friend recommended I enable <code class="language-plaintext highlighter-rouge">sshd</code> and just remote in to the
device. Doing so was a breeze, and I recommend to others who don’t have a
physical keyboard they can plug into their device. Drop to desktop mode
(hold the power button for a few seconds, and select the option), and start a
terminal (default is Konsole). Before remotely accessing the device, or using
elevated privileges via <code class="language-plaintext highlighter-rouge">sudo</code>, I need to set a password for the default user,
<em>deck</em>. In the terminal, type <code class="language-plaintext highlighter-rouge">passwd</code> and set it (and then put it in your
password vault so you don’t forget. You <em>do</em> have a password vault, right?).
Start the service, <code class="language-plaintext highlighter-rouge">sudo systemctl start sshd</code>, and optionally enable it to have
<code class="language-plaintext highlighter-rouge">sshd</code> automatically started on each boot (<code class="language-plaintext highlighter-rouge">sudo systemctl enable sshd</code>). Get
the device IP with <code class="language-plaintext highlighter-rouge">ip addr list</code>, from my desktop run <code class="language-plaintext highlighter-rouge">ssh deck@ip-address</code>,
type in the password, and now I’m a grade-A Hackermans.</p>

<p>This setting is not reset on SteamOS updates, that I can tell. Once enabled,
this will always start at boot, and always be on until explicitly turned off. Be
mindful of that if you decide to wander away from your home network; maybe turn
it off in public if you don’t need it.</p>

<h2 id="setup">Setup</h2>

<p>There are 2 things required: a systemd service file, and the <code class="language-plaintext highlighter-rouge">syncthing</code>
binary. Syncthing is written in Go, and a compiled binary can be downloaded that
has no dependencies or installation requirements. It can be downloaded from
the <a href="https://github.com/syncthing/syncthing/releases/tag/v1.20.3">Syncthing
Releases</a> page for
many platforms and architectures. The Steam Deck is a Linux platform, using the
AMD64 architecture (or x86_64), so I grab that one. I’ll note here, since I have
SSH access, I do all the editing and downloading on my desktop, and then
transfer the files using <code class="language-plaintext highlighter-rouge">scp</code> to the Deck. All of these steps can be done on
the Deck itself, without SSH access. Once the proper tarball has been
downloaded, extract it, and within will be the <code class="language-plaintext highlighter-rouge">syncthing</code> binary, ready to
rock. I copy/move the binary to <code class="language-plaintext highlighter-rouge">~/.local/bin/syncthing</code> on the Deck. The exact
location is less important than ensuring the binary is within my home directory
on the Deck.</p>

<p>The systemd serivce file can also be taken from the extracted tarball, but
requires modification. In the tarball, it is
<code class="language-plaintext highlighter-rouge">etc/linux-systemd/user/syncthing.service</code>. Copy this file to
<code class="language-plaintext highlighter-rouge">~/.config/systemd/user</code> on the Deck, and edit the “ExecStart” line in the
“[Service]” section from</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>...
[Service]
ExecStart=/usr/bin/syncthing serve --no-browser --no-restart --logflags=0
...
</code></pre></div></div>

<p>to</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>...
[Service]
ExecStart=/home/deck/.local/bin/syncthing serve --no-browser --no-restart --logflags=0
...
</code></pre></div></div>
<p>(or wherever you decided to put the local <code class="language-plaintext highlighter-rouge">syncthing</code> binary)</p>

<p>With everything in place, I can now enable and start the Syncthing user service:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl --user enable syncthing.service
systemctl --user start syncthing.service
</code></pre></div></div>

<p>Since I don’t have a physical keyboard plugged in, I modify my SSH command
slightly to forward the Syncthing web-UI from the Deck to my local machine:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh -L 31337:deck-ip-goes-here:8384 deck@deck-ip-goes-here
</code></pre></div></div>

<p>Now, on my local machine I can open one tab to <code class="language-plaintext highlighter-rouge">localhost:8384</code>, to show
Syncthing on my local machine, and another tab to <code class="language-plaintext highlighter-rouge">localhost:31337</code> to show
Syncthing on my Deck. From here, I add my local machine as a device on my Deck,
and begin sharing folders.</p>

<h2 id="closing-thoughts">Closing Thoughts</h2>

<p>I’ve been using this setup for about a week now. I’ve synced almost 20GB of
files, including configurations and saves for Retroarch. It works after
restarts, OS and client upgrades, and waking the device from sleep. It sits
quietly in the background, without having to start up applications. The biggest
problem is that it doesn’t automatically update to the newest version of
Syncthing. It’s also a bit involved to setup. To that end, I’ve written a tool
to help with setup: <a href="https://codeberg.org/VagabondAzulien/steam-deck-syncthing">Steam Deck Syncthing
Setup</a>. I’m still
finishing it up, but I intend to make use of it to keep my version of Syncthing
up-to-date. If you use it, let me know!</p>]]></content><author><name>Bill Niblock</name></author><summary type="html"><![CDATA[Syncthing on the Steam Deck (Updated!)]]></summary></entry><entry><title type="html">Oblivion on Linux, with Mods! Part 2 - Mods</title><link href="https://www.theinternetvagabond.com/2021/12/09/oblivion-linux-2.html" rel="alternate" type="text/html" title="Oblivion on Linux, with Mods! Part 2 - Mods" /><published>2021-12-09T00:00:00-06:00</published><updated>2021-12-09T00:00:00-06:00</updated><id>https://www.theinternetvagabond.com/2021/12/09/oblivion-linux-2</id><content type="html" xml:base="https://www.theinternetvagabond.com/2021/12/09/oblivion-linux-2.html"><![CDATA[<p>Every player’s mod list is different. Some will focus on visuals, making the
game as graphically impressive and pretty as possible. Others care primarily
about additional content. I tend towards the later, with a preference for
additional survival or realism mods. I recommend starting with the “Core Mods”
section in the <a href="https://www.nexusmods.com/oblivion/mods/49898">Oblivion Comprehensive Modding Guide by
Dispensation</a> which will cover
some essential performance and enhancement mods.</p>

<p>Below are some specific mods I would like to highlight, and which I enjoy.</p>

<h2 id="survival-related">Survival Related</h2>

<h3 id="basic-primary-needs--personal-hygiene">Basic Primary Needs &amp; Personal Hygiene</h3>

<ul>
  <li><a href="https://www.nexusmods.com/oblivion/mods/37088">Nexus Link - Basic Primary Needs</a></li>
  <li><a href="https://www.nexusmods.com/oblivion/mods/42038_">Nexus Link - Basic Personal Hygiene</a></li>
</ul>

<p>These two mods cover most of the survival aspects of my mod pack. “Basic Primary
Needs” adds hunger, thirst, and fatigue, while “Basic Personal Hygiene” adds
cleanliness. Managing these will feel tedious to some, but I really like having
to eat and drink, and visiting a bath house after a long time adventuring.</p>

<p>Each mod can make use of <a href="https://www.nexusmods.com/oblivion/mods/34905">additional HUD Status
Bars</a>, which makes tracking the
new needs much easier.</p>

<h3 id="travelers-tent">Traveler’s Tent</h3>

<ul>
  <li><a href="https://www.nexusmods.com/oblivion/mods/49654">Nexus Link</a></li>
</ul>

<p>This mod adds a portable player home, and is supremely comfy. Because I avoid
fast-travel, I wanted some sort of camping mod. I originally used <a href="https://www.nexusmods.com/oblivion/mods/37197">Maskar’s
Camping Mod</a> before learning of
this mod. By comparison, the tent in Traveler’s Tent feels almost like cheating,
but sometimes it’s important to treat yourself.</p>

<h2 id="world-enhancement">World Enhancement</h2>

<p>These I would consider my graphical improvements. I’m generally not too
concerned with making the game look good, but I love making the game feel more
realistic. These mods make Cyrodiil feel more alive.</p>

<h3 id="better-cities">Better Cities</h3>

<ul>
  <li><a href="https://www.nexusmods.com/oblivion/mods/16513/">Nexus Link</a></li>
</ul>

<p>This is a massive collection of city overhaul and enhancement mods. I was
awe-struck when I walked around the Imperial City for the first time with this
mod enabled. Bravil felt like a dangerous, crowded harbor town. Leyawin looks
like an actual place people live. Though the improvements do come with FPS hits.
Doubly-so if enabling the Open Cities option, which moves cities into the
overworld space, instead of their own individual instances. It’s a balancing
act: the immersion of walking directly into a city sometimes isn’t worth
crashing to desktop when adventuring around cities.</p>

<h3 id="cobl">COBL</h3>

<ul>
  <li><a href="https://www.nexusmods.com/oblivion/mods/21104">Nexus Link</a></li>
</ul>

<p>“Common Oblivion” enriches the world of Oblivion by adding lots of little
things, and helping different mods “talk” to each other. I like to think of it
as filling in a lot of the details that feel missing from vanilla Oblivion.</p>

<h3 id="enhanced-economy">Enhanced Economy</h3>

<ul>
  <li><a href="https://www.nexusmods.com/oblivion/mods/25078">Nexus Link</a></li>
  <li><a href="https://www.nexusmods.com/oblivion/mods/47184">Lubrons Patch</a></li>
</ul>

<p>This mod and the corresponding patch make the economy of the world more dynamic.
What I really like are the merchant quests that are added. Several merchants in
each town will ask you to find an item in one of the nearby dungeons. It adds
flavor to the game in just the right way.</p>

<p>Lubron’s Patch for Enhanced Economy fixes some bugs and cleans up the code a
bit.</p>

<h3 id="lights-of-oblivion---road-lanterns">Lights of Oblivion - Road Lanterns</h3>

<ul>
  <li><a href="https://www.nexusmods.com/oblivion/mods/46131">Nexus Link</a></li>
</ul>

<p>A very simple mod that I feel really enhances my travel around Cyrodiil. I avoid
fast-traveling whenever possible, and walking lit roads at night feels comfy.
I’m partial to the Imperial model.</p>

<h3 id="natural-environments">Natural Environments</h3>

<ul>
  <li><a href="https://www.nexusmods.com/oblivion/mods/2536">Nexus Link</a></li>
</ul>

<p>Arguably the only graphical enhancement mod, Natural Environments provides
options for modifying the weather, water, and vegetation around Cyrodiil. The
weather and vegetation enhancements especially stand out. Overall the mods
don’t cause me much performance impact, if any.</p>

<h3 id="cyrodiil-travel-services">Cyrodiil Travel Services</h3>

<ul>
  <li><a href="https://www.afkmods.com/index.php?/files/file/263-cyrodiil-travel-services/">AFK Mods Link</a></li>
</ul>

<p>I really enjoyed that in Skyrim there was a dude with a wagon you could pay to
travel to the various cities. This mod adds similar functionality, and then
some. Useful when playing the game without fast-travel enabled.</p>

<h2 id="overhauls">Overhauls</h2>

<p>Arguably, these are the heavy hitters. These mods will alter the mechanics of
the game, often making things more challenging but also more rewarding.</p>

<h3 id="maskars-oblivion-overhaul">Maskar’s Oblivion Overhaul</h3>

<ul>
  <li><a href="https://www.nexusmods.com/oblivion/mods/42780">Nexus Link</a></li>
</ul>

<p>Maskar’s Overhaul is a massive endeavor. It “[improves] many aspects of the
game, while maintaining the overall feel of the game and ensuring compatibility
with most other mods.” I think it does so with great success! However, be
forewarned, that this overhaul makes the game more challenging.</p>

<p>There is too much to cover about Maskar’s in this post, but I highly recommend
it. It comes with a PDF instruction manual, which is 61 pages long.</p>

<h3 id="vanilla-combat-enhanced">Vanilla Combat Enhanced</h3>

<ul>
  <li><a href="https://www.nexusmods.com/oblivion/mods/45314">Nexus Link</a></li>
</ul>

<p>As the name implies, this overhaul adjusts but does not change the vanilla
combat experience. Whereas other mods add new moves or fatigue systems, this mod
updates the vanilla combat experience to be more challenging and fair. It works
with Maskar’s after a small modification, which will be covered in the next
part. This is one of the mods that I haven’t played with for too long, and
there are definitely some additional or alternative combat mods I’m considering.
Namely, <a href="https://www.nexusmods.com/oblivion/mods/49873">Dynamic Oblivion Combat</a>
and <a href="https://www.nexusmods.com/oblivion/mods/49939">Combat Additions</a>.</p>

<h3 id="supreme-magicka">Supreme Magicka</h3>

<ul>
  <li><a href="https://www.nexusmods.com/oblivion/mods/12466">Nexus Link</a></li>
</ul>

<p>Rounding out the trio is a magic overhaul. Supreme Magicka approaches magic in
Oblivion in a similar way to Vanilla Combat Enhanced with combat: it seeks to
improve and expand, without replacing. To continue similarities, this mod is one
I haven’t sank my teeth into as much. The characters I’ve been playing most
recently haven’t achieved very powerful magical capabilities yet. An alternative
to this mod is <a href="https://www.nexusmods.com/oblivion/mods/49096">Av Latta
Magicka</a>.</p>

<h2 id="next-steps">Next Steps</h2>

<p>In the last part of this series, I want to walk through a complete install of
Oblivion from scratch.</p>]]></content><author><name>Bill Niblock</name></author><summary type="html"><![CDATA[Every player’s mod list is different. Some will focus on visuals, making the game as graphically impressive and pretty as possible. Others care primarily about additional content. I tend towards the later, with a preference for additional survival or realism mods. I recommend starting with the “Core Mods” section in the Oblivion Comprehensive Modding Guide by Dispensation which will cover some essential performance and enhancement mods.]]></summary></entry></feed>