- Rearranged navigation significantly
- Navbar is now unlimited width on desktop
- Navbar is now always on top of the screen, even on the landing page
- Navbar has been replaced with hamburger menu on mobile
- Significant styling alterations to look good on phones tm
- Most of the credit goes to a certain meta tag.
- (Appearance on desktop is mostly unchanged)
- The background on mobile is now 100% image, but darkened to improve contrast
- Table pages such as /links/ and /stats/ now rearrange on mobile:
column a column a column b
column b vs column a column b
column a column a column b
column b column a column b
- font size on landing page scales with device width on tall displays
- guestbook posts use CSS grid now
- Working on a @media (prefers-contrast: more) theme as well. Can't figure out how to test it though
- Updated /stats/
- Added some new stats
- Updated CD collection size
- Updated /about/uses/
- I now use Nextcloud News instead of Yarr
- My phone runs Graphene
- I use Fennec browser on mobile instead of standard Firefox
- New background as the old one was horrible for contrast
- Added Waxlimbs - For Science! to /about/music/
- The oldest three articles on /blog/ now show a warning on hover that they're from the legacy v2 site
- Corrected various markup issues with the help of validator.w3.org/nu/
- Added alt text to a ton of images
- todo list is no longer a separate html file. it was fucking with the scaling on mobile and I couldn't be bothered
- /stuff/ remains unchanged. I'll get to it
- Hopefully that's everything lol
<p><spantitle="General Kenobi!">Hello there!</span> They call me Will, but I tend to go by deep twisty (more on that later) or some variation of "isopod" or "bathynomus" on the internet. I like to make stuff on the computer, like <ahref="https://deeptwisty.bandcamp.com/">music</a>, or <ahref="https://deeptwisty.com/art">art</a>, or this website. I've heard rumors calling me such things as "canadian", "autistic", and "incalculably talented". I cannot confirm or deny any of these allegations.</p>
<p><spantitle="General Kenobi!">Hello there!</span> They call me Will (any pronouns), but I tend to go by deep twisty (more on that later) or some variation of "isopod" or "bathynomus" on the internet. I like to make stuff on the computer, like <ahref="https://deeptwisty.bandcamp.com/">music</a>, or <ahref="https://deeptwisty.com/art">art</a>, or this website. I've heard rumors calling me such things as "canadian", "autistic", and "incalculably talented". I cannot confirm or deny any of these allegations.</p>
<h2>What's a "deep twisty"?</h2>
<p>"deep twisty" is a pseudonym I came up with to release music under, because everyone is doing it. It comes from some tweets from an <ahref="https://web.archive.org/web/20221214182955/https://twitter.com/SubnauticaSCM/status/1095774020446744576">official Subnautica twitter account</a> where they referred to the then-work-in-progress Deep Twisty Bridges biome as just "deep twisty". I thought it sounded funny. Funny enough to brand myself on, apparently.</p>
<p>As for "niceopod", "nice" was the best word I could think of that rhymes with the first syllable of "isopod". I feel like it sounds like I'm trying to say I'm nice. <span title="I'm slowly deprecating this username for this reason. You'll typically find it replaced with "isopod" or "bathynomus" or some other isopod-related thing, depending on availability.">I'm not</span>, it's just that the alternatives were "iceopod" and "sliceopod". Isopods are nice though.</p>
<!--p>As for "niceopod", "nice" was the best word I could think of that rhymes with the first syllable of "isopod". I feel like it sounds like I'm trying to say I'm nice. <span title="I'm slowly deprecating this username for this reason. You'll typically find it replaced with "isopod" or "bathynomus" or some other isopod-related thing, depending on availability.">I'm not</span>, it's just that the alternatives were "iceopod" and "sliceopod". Isopods are nice though.</p-->
<p>I go by Will because that's my name and I can't be fucked changing it.</p>
<h2>About the site</h2>
<p>This website is written in pure HTML, CSS, and a tiny bit of Javascript with the server-side stuff done in PHP. It (and everything else I host) is hosted using Nginx on a VPS with 2GB of RAM and 1 CPU core running Ubuntu Server, with domains registered with <ahref="https://porkbun.com/">Porkbun</a>.
<astyle="--img: url(covers/ultrakill_imperfect_hatred.png);"target="_blank"href="https://heavenpierceher.bandcamp.com/album/ultrakill-imperfect-hatred"><span>Heaven Pierce Her - ULTRAKILL: Imperfect Hatred</span></a>
<astyle="--img: url(covers/el_camino.png);"target="_blank"href="https://theblackkeys.com/?frontpage=true"><span>The Black Keys - El Camino</span></a>
<astyle="--img: url(covers/for_science.png);"target="_blank"href="https://waxlimbs.bandcamp.com/album/for-science"><span>Waxlimbs - For Science!</span></a>
<astyle="--img: url(covers/triangle_unicode.png);"target="_blank"href="https://wearemagonia.bandcamp.com/album/triangle-unicode-lp"><span>We Are Magonia - Triangle Unicode</span></a>
<imgsrc="images/pc1.png"style="width: 50%;"alt="My computer tower. The CPU heatsink, graphics card, RAM, and optical drive are prominently visible.">
<imgsrc="images/pc2.png"style="width: 50%;"alt="Closer shot of the inside of my compter with the glass side panel removed. My shoddy cable management is on full display.">
</details>
</li>
<li>
@ -173,26 +179,20 @@
</details>
</li>
<li>
My phone is a <b>Google Pixel 4a</b> running <ahref="https://grapheneos.org/">Graphene</a>.
My phone is a <b>Google Pixel 4a</b>.
<details>
<summary>More details</summary>
<p>I said I was going to wait until my old LG K61 became unusable before replacing it. I thought I'd failed to do that right up until
its replacement, a used flagship from nearly three years ago, arrived and blew it out of the water in almost every way. I never noticed
its replacement, a used flagship from the same time period, arrived and blew it out of the water in almost every way. I never noticed
up until now just how painfully unresponsive my old phone was. Mobile websites are, like, usable now!</p>
<p>Performance was never a consideration in buying the phone, though. I'm not a huge fan of the idea of using a Google device, but the Pixel line are the only devices supported by
Graphene OS, possibly the single most secure and private mobile OS currently on the market short of full fat Linux on something like a Pinephone.
It's got a number of nice features: the OS has been fully stripped of all of Google's slimy little rootkit tentacles, and even if you do need
to install Google Play Services for something like an app that relies on it for push notifications, it's as aggressively sandboxed as any other app.
That's another thing - Graphene has powerful per-app permission settings, allowing you to turn off network and even hardware sensor access for apps you
don't trust, and every app you download has almost no permissions by default. I'll stop gushing about it here now, Graphene's features page has its own comprehensive overview.</p>
<p>So I kind of had to get a Pixel if I wanted Graphene, but why the 4a in particular? There are more recent, largely better models within my price range.
Graphene OS. But why the 4a in particular? There are more recent, largely better models within my price range.
Mainly, I chose to get the specific model I did because it was the last Pixel device to be released with two important attributes: the presence of a headphone jack,
and the lack of 5G support. The headphone jack, I think, is self-explanatory. I <i>never</i> intend to purchase a phone without one if I can avoid it. As for the 5G, I don't trust it.
Basically, much of the performance improvement 5G offers comes from a new transmission technique called beam forming, where instead of blasting every signal equally in all directions
like a radio tower it specifically calibrates the signal for a given device such that it's effectively focused in a narrow cone directed at that device, and for this to work properly
the tower needs to know where the phone is at a level of precision that is within inches. I feel like I shouldn't need to explain why that's scary.
</p>
<p>Yeah, so in summary, phone's good, installation process is easy, I recommend it if you can deal with the small amount of jank caused by the Android ecosystem's dependency on Google <s>Rootkit</s> Play Services.</p>
</details>
</li>
<li>I have a <b>Nintendo Switch</b> that, admittedly, doesn't see much use. Kirby and the Forgotten Land was good,
@ -245,7 +245,7 @@
<spantitle="Java Edition, mind. I could have played Pocket Edition anytime I wanted. Minecraft on anything but the PC used to suck big-time. Feature parity didn't exist. I think Chromebooks might even be able to run Minecraft Bedrock Edition now with the Android app support. Honestly, I think it would still be worth hacking proper Linux onto them to play the real deal.">Minecraft</span> on it, which Chromebooks famously can't do,
so naturally the logical solution was to install Linux on the thing with Crouton in order to run it. It was
incredibly sketchy, janky, and not exactly performant, but I got my Minecraft and that was what mattered. I
killed it 9 months in by overworking its poor little <spantitle="When I say overworked, I mean it. The thing was redlining basically all the time whenever I was doing about anything in the Linux environment, especially Minecraft. It would overhead so much so often I'm pretty sure I melted the adhesive keeping the bottom panel on, because by the end of its life that thing was in a pretty much constant state of nearly coming off.">passively
killed it 9 months in by overworking its poor little <spantitle="When I say overworked, I mean it. The thing was redlining basically all the time whenever I was doing about anything in the Linux environment, especially Minecraft. It would overheat so much so often I'm pretty sure I melted the adhesive keeping the bottom panel on, because by the end of its life that thing was in a pretty much constant state of nearly coming off.">passively
cooled</span> Celeron CPU, and after that I mostly stuck with Windows on the two HP laptops I had over the
next six years for software compatibility reasons, but I tried to switch back to Linux occasionaly.</p>
<p>I finally pulled it off last year, when I used a combination of upsetting news about Windows 11 and a
@ -260,8 +260,11 @@
</details>
</li>
<li>
I use <ahref="https://www.mozilla.org/en-US/firefox/new/"target="_blank">Firefox</a> as my only web browser
outside of testing.
<p>My phone runs <ahref="https://grapheneos.org/">Graphene OS</a>. It's a hardened fork of the Android Open Source Project with all of Google's proprietary spyware stripped out. It's the only reason I bought a Pixel and it's very nice. I'd go into more detail, but the devs do a great job of that on their website.</p>
</li>
<li>
I use <ahref="https://www.mozilla.org/en-US/firefox/new/"target="_blank">Firefox</a> as my main web browser
outside of testing. On mobile I use the <ahref="https://f-droid.org/packages/org.mozilla.fennec_fdroid/">Fennec</a> fork.
<details>
<summary>More details</summary>
<p>I really like Firefox. It's customizable as hell, the dev tools are better, and it's designed to keep your
@ -278,7 +281,7 @@
</li>
<li>For Chromium testing and the occasional poorly-built website that just doesn't want to run in Firefox, I use <a
<li>I use a self-hosted <ahref="https://github.com/nkanaev/yarr">Yarr</a> instance for my RSS reader.</li>
<li>I currently use the News app on my self-hosted Nextcloud instance for RSS, with the default Android app.</li>
<li>Loathe as I am to admit it, Microsoft's Visual Studio Code is really good. Which is why I use <a
href="https://vscodium.com/" target="_blank">VSCodium</a>, an open-source build with all the telemetry
stripped out.
@ -332,12 +335,11 @@
<details>
<summary>More details</summary>
I also have a <i>heavily</i> customized <ahref="https://github.com/hykilpikonna/hyfetch">fetch</a> script I'm currently itching to show off:
<imgsrc="images/2022-12-20_zsh.png"alt="A heavily customized HyFetch (neofetch with pride flags, essentially) featuring, among various stock readouts, fully custom GPU and GPU load and temperature readouts, a fully custom indicator of what media is playing, and a custom to-do list. All of this stuff is absolutely caked in dynamically drawn Unicode box drawing characters and ANSI control codes. The ASCII Manjaro logo has nonbinary pride flag colors. The color theme at play is gruvbox."title="My HyFetch config and accompanying zsh prompt, as of 2022-12-20. The zsh prompt is pretty much stock Powerlevel10k, but the HyFetch above it has been gutted and reassembled out of ANSI control codes and sed commands into something borderline unrecognizable. I'm pretty sure it's radioactive. It's slick as fuck though. The TODO and Playing segments are fully custom and drawn dynamically. I've also configured it to not show when logging in via ssh or the VSCode/kate integrated terminals. Don't ask why I enabled sshd on my home computer."/>
<imgsrc="images/2022-12-20_zsh.png"alt="A heavily customized HyFetch (neofetch with pride flags, essentially) featuring, among various stock readouts, fully custom GPU and GPU load and temperature readouts, a fully custom indicator of what media is playing, and a custom to-do list. All of this stuff is absolutely caked in dynamically drawn Unicode box drawing characters and ANSI control codes. The ASCII Manjaro logo has nonbinary pride flag colors. The color theme at play is gruvbox."title="My HyFetch config and accompanying zsh prompt, as of 2022-12-20. The zsh prompt is pretty much stock Powerlevel10k, but the HyFetch above it has been gutted and reassembled out of ANSI control codes and sed commands into something borderline unrecognizable. I'm pretty sure it's radioactive. It's slick as fuck though. The TODO and Playing segments are fully custom and drawn dynamically. I've also configured it to not show when logging in via ssh or the VSCode/kate integrated terminals. Don't ask why I enabled sshd on my home computer.">
$wn = "title=\"This post is on the archived v2 version of the site. It will not load if you don't have Javascript enabled, and expect jank if viewing on mobile. You have been warned.\" ";
<p>I got a new phone recently! It's a Google Pixel 4a. I wouldn't ordinarily even entertain the idea of using a Google phone, but the Pixel line are the only phones supported by my custom OS of choice, Graphene. I chose the 4a in particular because it was the last Pixel to ship with two important features: a heaphone jack and no 5G support. Did you know that 5G connectivity allows your phone to be tracked to within inches of its position? Cool, right?</p>
<p>I also got a new keyboard. I bought a TKL keyboard and accompanying separate numpad from Keychron because they didn't have any 100% keyboards in the color I wanted. They're really good, much better than my old Logitech in about every possible way. In fact, while writing this I tested them both side by side and noticed that the old keyboard has, like, this hollow ring to it that I never realized wasn't normal. Having used something nicer, it feels and sounds pretty shitty in comparison. All that said, ordering from Keychron fucking sucked. Their system flagged my order as potentially fraudulent and it literally took weeks to convince them to ship it to me. Buy their shit, but buy it somewhere other than their website.</p>
</article>
<articleid="2023-02-07">
<articleid="2023-02-09">
<h2>2023-02-09</h2>
<p>I've deprecated the changelog on my website in favor of just linking an RSS feed of my <ahref="https://git.isopod.cool/will/isopod.cool/commits/branch/main">git commits</a> to it. Strictly speaking this is probably a worse user experience, but it's my website and I'm too lazy to keep maintaining two changelogs. Figured I'd announce it here in case someone is regularly checking on the changelog but isn't subscribed to its Atom feed and is curious what happened.</p>
<p>In other news, job's going alright so far. On my last shift I learned how to take apart the meat grinder for cleaning. Currently waiting on the arrival of some shoes I ordered that should be better for working retail in than my old ones, which are so worn out it's like standing barefoot on the floor all day. Speaking of all day, I've got a bunch of eight-hour shifts coming up, so I'm excited for that (← lying). Money is money I guess.</p>
<imgloading="lazy"src="images/2023-02-07_lollmao.png"alt="Email from johnsmith98969896@gmail.com to sussybaka.uwu@bathynomus.xyz: Hello, [four line breaks] My name is john smith and I am a Digital Marketer and Content Writer, [three line breaks] myself, write unique and outstanding content that can be added to your website. [three line breaks] Please let me know if you accept guest blogs so I can share some topics. You can also suggest to me any topic of your choice. [four line breaks] If you are interested in my proposal, please reply positively."/>
<imgloading="lazy"src="images/2023-02-07_lollmao.png"alt="Email from johnsmith98969896@gmail.com to sussybaka.uwu@bathynomus.xyz: Hello, [four line breaks] My name is john smith and I am a Digital Marketer and Content Writer, [three line breaks] myself, write unique and outstanding content that can be added to your website. [three line breaks] Please let me know if you accept guest blogs so I can share some topics. You can also suggest to me any topic of your choice. [four line breaks] If you are interested in my proposal, please reply positively.">
</picture>
<p>No, John, no I do not.</p>
</article>
@ -131,7 +137,7 @@
<ul>
<li>The UI is bloated, slow, and overly javascript-y, like it's trying and failing to be an app</li>
<li>My ability to access their website via anything but Chromium with no VPN is spotty at best</li>
<li>I had to go through support to get <spantitle="Like an A record, but for IPv6. Basically, A and AAAA records are the DNS records that point your computer to an IP address when you enter a URL. Very important.">AAAA records</li> added to my domains. There's just not an option in the UI for it.</li>
<li>I had to go through support to get <spantitle="Like an A record, but for IPv6. Basically, A and AAAA records are the DNS records that point your computer to an IP address when you enter a URL. Very important.">AAAA records</span> added to my domains. There's just not an option in the UI for it.</li>
<li>I've still got upcoming bills for my domains AFTER transferring them away with no obvious way to cancel them or remove payment information</li>
<li>No clear way to delete my account either</li>
<li>Also, they charge extra for WHOIS privacy</li>
<p>Wow, I haven't seen you since last year! I told you I wouldn't get another post out within a week. I bought Factorio for myself for Christmas, and that was a mistake. I already have 83 hours logged in my save file, and I've probably played a bit more than that because I save scum like crazy when fighting biters.</p>
<p>In spite of this, I've actually done some stuff on the ol' website! I've got an article in the works, and I've created a <ahref="../etc/quotes/">page</a> immortalizing all the funniest bullshit my friends and I have said in our discord group chat. I'm real proud of it, I wrote some PHP code to generate HTML styled like real discord messages. It's nicer presentation, easier on my server's storage space, and better for screen readers than uploading screenshots! Fair warning if you want to check it out, there's quite a high density of "sex joke".</a>
<p>In spite of this, I've actually done some stuff on the ol' website! I've got an article in the works, and I've created a <ahref="../etc/quotes/">page</a> immortalizing all the funniest bullshit my friends and I have said in our discord group chat. I'm real proud of it, I wrote some PHP code to generate HTML styled like real discord messages. It's nicer presentation, easier on my server's storage space, and better for screen readers than uploading screenshots! Fair warning if you want to check it out, there's quite a high density of "sex joke".</p>
</article>
<articleid="2022-12-21">
<h2>2022-12-21</h2>
@ -192,9 +198,9 @@
<details>
<summary>Click to be subjected</summary>
<p>Thanks. I really needed to get this out of my system.</p>
<imgsrc="images/2022-12-21_zsh.png"alt="The sickest damn Neofetch config you've ever seen in your life"/>
<imgsrc="images/2022-12-21_zsh.png"alt="The sickest damn Neofetch config you've ever seen in your life">
<p>Admittedly, this is actually a fork of Neofetch called Hyfetch. It's functionally the same though, all it does is color the ASCII Manjaro logo with nonbinary pride flag colors. Anyway, just look at this shit. I'm gonna brag about every damn detail of it to you now. First off, those lines surrounding everything are dynamically drawn. The width of the box is dependent on the width of the <spantitle="It's just the top line because I know that one's likely to always be the longest">top line</span> there. All the shit underneath is dynamic too. That "playing" indicator goes away completely when nothing's playing, and as a fun little touch I made it so that separators in the title string like " - " and " | " are replaced with a line that connects up to the box. The to-do list below it isn't hard coded either. That thing pulls from a text file in my home directory and dynamically draws those lines to connect to each item, and it also disappears when there's nothing in the to-do list. I've configured zshrc to only show this when I log in via terminal emulators so it doesn't clog up my IDE terminal windows or my <spantitle="Don't ask.">ssh</span> client. Half these readouts are custom. I had to install a whole separate program (shoutout <ahref="https://github.com/clbr/radeontop">radeontop</a>) to get the GPU load. I had to learn both sed and ANSI escape codes to get this to work. It's so packed to brimming with both I almost want to throw up looking at it, and I didn't even get most of it off Stack Overflow. I can do all this crazy crap because Neofetch's config file is literally just a shell script it runs, but that also means I had to write all that shit in <i>bash</i>. Let me tell you, it's a bitch and a half to get almost anything of substance done in that fuckin' mess of a language. I learned the hard way it can only do integer math on its own. Javascript's weird type coercion shit and Lua counting arrays from 1 instead of 0 is child's play compared to what I had to deal with to get my Neofetch looking all pretty. If statements in this nightmare language are fucking indecipherable. I had to search for "bash if" more than I had to search for anything related to that ANSI control code fuckery.</p>
<imgsrc="images/2022-12-21_ssh.png"alt="An equally sick fetch script as the first, but fully custom and running on my VPS"/>
<imgsrc="images/2022-12-21_ssh.png"alt="An equally sick fetch script as the first, but fully custom and running on my VPS">
<p>I also have this. I coded it for my VPS, just because, and it's <i>entirely</i> custom. From <spantitle="Except the ASCII art. I stole the ASCII art from Neofetch. It's my code printing it and my ANSI escapes coloring it, though.">scratch</span>. This is how I learned Bash can't do floating point math. Did I need to do this? No. Was there any good reason for me to do this? Probably not. What's your point?</p>
</details>
<p>I also went bowling today, so that was fun. I sucked shit at it. There was pizza.</p>
@ -220,15 +226,14 @@
<h2>2022-11-06</h2>
<p>I've started the first of my classes! So far it's been mostly reading the textbook and making tedious discussion posts about it in the class forum. I understand on some level why they make us do it, but that doesn't make it not annoying.</p>
<p>All this stuff going on hasn't left me with a ton of time or energy to update my website. One course isn't exactly a full load, but between doing the course work, procrastinating on the course work, working on this music video, procrastinating on that, and my utterly wrecked sleep schedule, there just doesn't seem to be enough hours in the day.</p>
<p>Speaking of the music video, here's some more renders of it I've made if you're interested:
This second one was rendered in a secret third thing, Workbench, a barebones rendering engine with basically no graphical features at all that I used here just to see how some timings would look in the final product.
</details>
</p>
<p>Speaking of the music video, here's some more renders of it I've made if you're interested:</p>
This second one was rendered in a secret third thing, Workbench, a barebones rendering engine with basically no graphical features at all that I used here just to see how some timings would look in the final product.
</details>
<p>I've also finally made some progress towards getting some kind of ADHD medication, so hopefully that will help somewhat.</p>
</article>
<articleid="2022-10-28">
@ -257,12 +262,12 @@
<p>I've been working on that music video I mentioned in... uh... July. I'd be lying if I said I thought I was making good progress, but I'm certainly making progress. Here's some pictures:</p>
<details>
<summary>Pictures</summary><br>
<imgwidth="100%" src="images/2022-10-01_arm.png"alt="A low-poly 3D render of a robotic arm mounted on a vertical rail"/>
<imgwidth="100%" src="images/2022-10-01_drone.png"alt="A low-poly 3D render of a quadcopter-style drone carrying a cube with "CRATE" crudely scrawled on the front"/>
<imgwidth="100%" src="images/2022-10-01_cam.png"alt="A low-poly 3D render of a wall-mounted camera with a glowing green light below the lens"/>
<imgstyle="width:100%;" src="images/2022-10-01_arm.png"alt="A low-poly 3D render of a robotic arm mounted on a vertical rail">
<imgstyle="width:100%;" src="images/2022-10-01_drone.png"alt="A low-poly 3D render of a quadcopter-style drone carrying a cube with "CRATE" crudely scrawled on the front">
<imgstyle="width:100%;" src="images/2022-10-01_cam.png"alt="A low-poly 3D render of a wall-mounted camera with a glowing green light below the lens">
Your browser does not support the video tag. Watch it <ahref="images/2022-10-01_mv_preview.mp4">here</a>.
</video>
</details>
@ -309,6 +314,7 @@
<p>I've had my driver's license for a few days now. I've even driven a couple of places... independently! It's proving to be significantly less terrifying than I was expecting, they said, jinxing themself.</p>
<p>Yeah, about that bit at the end there. The short version is, I'm no longer certain of my gender. You'd know this already if you've been poking around my site of late<spantitle="😎">;</span> I've taken quite a while to actually properly write about it. I guess I just felt weird about making it "official" by discussing it, so to speak. Anyway, I've started using he/they as opposed to the default he/him in spaces where I feel comfortable doing so, like here. Just to try it out. Seeing how I like it. Gathering data, et cetera. We'll see how it works out. Gender is hard.</p>
<p>Oh, and the car's fine, by the way. We think there was a broken seal somewhere in the power steeing system. The repair was expensive.</p>
</article>
<articleid="2022-08-12">
<h2>2022-08-12</h2>
<p>It's been an exciting 24 hours. I'm <i>actually</i> just about over this cold, it seems, for one. Also, I took my driver's exam today! I passed with 60 out of a possible 75 demerit points. Not phenomenal, but good enough! I am now officially a licensed driver! I smelled steering fluid during the parking section of the test though, so we took the family car I took it in to a mechanic immediately after. Fun stuff. In nicer news, we celebrated with ice cream cake afterwards!</p>
@ -373,15 +379,14 @@
<h2>2022-07-14</h2>
<p>Instead of writing a new blog post, I have added an <ahref="https://journal.miso.town/">HTML Journal</a> to my site. <spantitle="Naturally, the logical conclusion of this is one page each for posts of every possible word count.">This will be a place for posts that are too short to warrant a blog post, but too long to be a <ahref="https://status.cafe/users/niceopod">status</a>.</span> For example:</p>
<p>I installed some RGB strips in my computer recently! Well, one RGB strip. I bought two, but they were both a meter long and I seem to have underestimated just how long that is. When I built the computer, I figured I didn't need RGB, so I went out of my way a little to avoid it and then I realized that the glass panel on my case was tinted so I couldn't even see in. Hence the RGB strip, because I didn't want to spend money replacing perfectly good parts with ones that light up. I've got the strip crammed in a gap next to the wall of the case where it's blocked from direct view so that it just illuminates the inside and doesn't shine in my face. Here's a picture:</p>
<img src="images/2022-07-14_PC-RGB.jpg"style="width: 50%; margin: 0 25%;"alt="My computer tower. The inside is illuminated in rainbow colors by a hidden RGB LED strip.">
<p>It's not exactly radiant compared to some other peoples' setups, but I like it. It's subtler.</p>
<p>Cool, right? I've retrofitted the blog post list to be compliant with HTML Journal's fresh new sister spec, <ahref="https://blog.miso.town/">HTML Blog</a>, as well, mainly for the automatic feed generation it offers.</p>
<p>Paste this into the main <code>server</code> block of your Nginx config to instantly drop the connection to any client with a "Wildebeest" (case insensitive) user agent:</p>
if ($http_user_agent ~* (wildebeest|googlebot)) {<br>
return 444;<br>
}
@ -62,13 +55,13 @@
<h3>Includes</h3>
<p>One thing I'd recommend doing is moving all your user agent blocks to a separate file that you can include in all your Nginx sites. I place this file at <code>/etc/nginx/includes/bans</code>:</p>
<h2id="caption">Self-Host Safely with WireGuard</h2>
<h2id="caption">Self-Host Safe(r)ly with WireGuard</h2>
<nav>
<ahref="../../../">home</a>
<ahref="../../">blog</a>
</nav>
<details>
<summary><h2>Preamble</h2><h6>Click to show</h5></summary>
<summary><h2>Preamble</h2><h6>Click to show</h6></summary>
<p>If you're like me, you don't like relying on other people for your online services, either because you don't want to give out your data unnecessarily, or just because you don't want to shell out for subscription services. You might be willing to host such services yourself, and you might even have access to spare hardware to do it on.</p>
<p>One critical issue arises, however: your home network. Maybe you're behind some weird impenetrable NAT setup you don't control, or maybe your IP address is dynamic and changes regularly, or maybe you just don't want to expose your home IP to the world. What then?</p>
<p>Luckily for us, there's a way to circumvent all that nonsense. A custom VPN like the one we'll be setting up today, hosted on an external server like a VPS, can punch through any weird home internet configuration while also swapping out your home IP address for a static one that you can feel safe exposing to the world.</p>
@ -50,14 +50,14 @@
<code>$ sysctl -w net.ipv4.ip_forward=1</code>
<h3>On the client</h3>
<p>We'll need to generate a public/private key pair for each machine on our VPN network. Do that now for our client like so:</p>
<p>This generates a private key for WireGuard and then generates a corresponding public key based on it. Our client's keys can now be found in <code>/etc/wireguard/client_priv.key</code> and <code>/etc/wireguard/client_pub.key</code> for our private and public keys respectively.</p>
<h3>Back to the server</h2>
<h3>Back to the server</h3>
<p>Now do the same for the server:</p>
<code>$ umask 077 ; wg genkey > /etc/wireguard/server_priv.key<br/>$ wg pubkey < /etc/wireguard/server_priv.key > /etc/wireguard/server_pub.key</code>
<code>$ umask 077 ; wg genkey > /etc/wireguard/server_priv.key<br>$ wg pubkey < /etc/wireguard/server_priv.key > /etc/wireguard/server_pub.key</code>
<p>Our server's keys can now be found in <code>/etc/wireguard/server_priv.key</code> and <code>/etc/wireguard/server_pub.key</code> for our private and public keys respectively.</p>
<p>Now, create a WireGuard configuration file at <code>/etc/wireguard/wg0.conf</code>. <code>wg0</code> will be the name of our network interface, you can name yours something else if you'd like.</p>
<p>Paste the server's private key after <code>PrivateKey =</code> in <code>[Interface]</code> and the client's public key after <code>PublicKey =</code> in <code>[Peer]</code>.</p>
<p>With this setup, our server will use the virtual local IP <code>172.16.0.1</code> and our client will use the IP <code>172.16.0.2</code>. You can also add up to 254 more clients by duplicating the <code>[Peer]</code> block and and updating it with the respective public key and a new local IP address.</p>
<p>Now, enable and start the WireGuard service with</p>
@ -65,7 +65,7 @@
<p><code>wg0</code> being what we called our network interface before.</p>
<h3>Back to the client</h3>
<p>Create a WireGuard configuration file for our client at <code>/etc/wireguard/myvpn.conf</code> (you can replace <code>myvpn</code> with a different name if you so choose):</p>
<code>[Interface]<br/>Address = 172.16.0.2/24<br/>PrivateKey = #(client's private key goes here)<br/># Optionally, set to your desired DNS server<br/># DNS = 9.9.9.9<br/><br/>[Peer]<br/>PublicKey = #(server's public key goes here)<br/># Endpoint (server) can be a domain name or IP address<br/>Endpoint = (server's public IP goes here):51820<br/># Traffic to route to server<br/>AllowedIPs = 0.0.0.0/0, ::/0<br/>PersistentKeepalive = 25</code>
<code>[Interface]<br>Address = 172.16.0.2/24<br>PrivateKey = #(client's private key goes here)<br># Optionally, set to your desired DNS server<br># DNS = 9.9.9.9<br><br>[Peer]<br>PublicKey = #(server's public key goes here)<br># Endpoint (server) can be a domain name or IP address<br>Endpoint = (server's public IP goes here):51820<br># Traffic to route to server<br>AllowedIPs = 0.0.0.0/0, ::/0<br>PersistentKeepalive = 25</code>
<p>Make sure you use your server's public IP here. The PersistentKeepalive option is there because WireGuard closes the connection by default if no data comes through for a while and will only reopen it for the client, so here we send a KeepAlive packet every 25 seconds to prevent that in order to keep our client accessible from the internet.</p>
<p>Now we start WireGuard:</p>
<code>$ sudo wg-quick up myvpn</code>
@ -77,13 +77,13 @@
<code>$ ufw route allow proto tcp to 172.16.0.2 port 25565</code>
<p><code>25565</code> being your relevant port. Repeat this command as necessary.</p>
<p>Now we need to configure iptables. We can do this through UFW by adding the following onto the very end of the file <code>/etc/ufw⁠/before.rules</code>:</p>
<tr><td><code>command | command2</code></td><td>uses the output of one command as the input to the next</td></tr>
<tr><td><code>command > file</code></td><td>saves the output of a command to a file</td></tr>
<tr><td><code>command <file</code></td><td>uses a file as the input to a command</td></tr>
<tr><td><code>command <fileA> fileB</code></td><td>will therefore run <code>command</code> with the contents of <code>fileA</code> as the input, and save the output to <code>fileB</code></td></tr>
<tr><td nowrap><code>command <<< "string or $variable"</code></td><td>will use the string or variable as the input to a command, the same as <code> <file</code></td></tr>
<tr><td><code>command > file</code></td><td>saves the output of a command to a file</td></tr>
<tr><td><code>command < file</code></td><td>uses a file as the input to a command</td></tr>
<tr><td><code>command < fileA > fileB</code></td><td>will therefore run <code>command</code> with the contents of <code>fileA</code> as the input, and save the output to <code>fileB</code></td></tr>
<tr><tdstyle="white-space:nowrap;"><code>command <<< "string or $variable"</code></td><td>will use the string or variable as the input to a command, the same as <code> < file</code></td></tr>
<tr><tdcolspan="2"><h4>variables</h4></td></tr>
<tr><td><code>variable=value</code></td><td>assigns a variable</td></tr>
<li>Force a <code><td></code> element not to wrap by adding the <code>nowrap</code> attribute to it.</li>
<li>Force a <code><td></code> element not to wrap by adding the <code>white-space:nowrap;</code> CSS property to it.</li>
<li>Set the <code>table-layout</code> CSS property to <code>fixed</code> to force the the columns to be equal widths.</li>
</ul>
<h4>PHP</h4>
<ul>
<li>The <code>date()</code> function in PHP returns date information. The first argument is a format string and the second is an optional integer for a Unix timestamp. The valid format characters as of PHP 8 can be found <ahref="https://www.php.net/manual/en/datetime.format.php">here</a>, and examples are listed in this table:</p>
<li>The <code>date()</code> function in PHP returns date information. The first argument is a format string and the second is an optional integer for a Unix timestamp. The valid format characters as of PHP 8 can be found <ahref="https://www.php.net/manual/en/datetime.format.php">here</a>, and examples are listed in this table:
<details>
<summary>Show table</summary><br>
It is currently <?phpechodate('l, F j, Y \a\t g:i:s A T');?><br><br>
<imgsrc="buttons/35mm.gif"alt="Best heard through a 3.5mm jack">
<imgsrc="buttons/tested_on_firefox.gif"alt="Tested on Firefox">
<imgsrc="buttons/nowebp.gif"alt="No WebP! Just use PNG">
<atarget="_blank"href="http://web3.14159.annwfn.net/"><imgsrc="buttons/web-pi.png"alt="Web Pi Certified"></a>
<atarget="_blank"href="https://neocities.org"><imgsrc="buttons/neocities_stamp.gif"alt="Neocities: The web is yours"></a>
<atarget="_blank"href="http://www.ermel.org/handcoded/"><imgsrc="buttons/handcode.png"alt="100% hand coded HTML"></a>
<atarget="_blank"href="https://12ft.io/"><imgsrc="buttons/dontyouhate.gif"alt="Don't you hate it when you're reading a page and then some-- This content is for subscribers only! Paywalls Gatekeep Knowledge."></a>
<imgsrc="buttons/righttorepair.png"alt="I support right to repair">
<imgsrc="buttons/google_stand.gif"alt="Stand up to Google! Fight for open web standards! Fight for online privacy! Fight against monopolistic practices!">
<atarget="_blank"href="https://www.mozilla.org/en-US/firefox/new/"><imgsrc="buttons/chrome.gif"alt="Google Chrome is evil!"></a>
<imgsrc="buttons/i_hate_microsoft.png"alt="I hate Microsoft">
<td>A custom resource pack I made for Minecraft that uses the <ahref="https://optifine.net/home">Optifine mod</a>'s custom texture functionality to add custom textures for enchanted tools and weapons. Works as of 1.19.</td>