diff --git a/posts/advent-of-languages-2024-03.svx b/posts/advent-of-languages-2024-03.mdx
similarity index 99%
rename from posts/advent-of-languages-2024-03.svx
rename to posts/advent-of-languages-2024-03.mdx
index 4407970..6c5c6d9 100644
--- a/posts/advent-of-languages-2024-03.svx
+++ b/posts/advent-of-languages-2024-03.mdx
@@ -3,7 +3,7 @@ title: 'Advent of Languages 2024, Day 3: Forth'
date: 2024-12-07
---
-
+import Sidenote from '@components/Sidenote.astro';
My original plan was to stick with the "systems language" theme for Day 3 and go with Zig, but the more I thought about it the more I started to think, you know, Zig is nice and clean and modern. It hasn't had time to get all warty and ugly with bolted-on afterthoughts and contentious features that divide the community into warring tribes, and it has things like common datastructures in its standard library. I should probably save it for one of the later days, when I anticipate spending more time fighting _the problem_ and less time fighting _the language_. Also I looked at Day 3 and it (the first part at least) looked very simple, which makes me even less inclined to use a big honkin' heavy-duty language like Zig. Instead, today I'm going to take a look at Forth!I know, I know, I would have been able to make all kinds of terrible jokes had I just waited for the _forth_ day of the AoC, but hey, we can't all get what we want.
diff --git a/posts/advent-of-languages-2024-05.svx b/posts/advent-of-languages-2024-05.mdx
similarity index 97%
rename from posts/advent-of-languages-2024-05.svx
rename to posts/advent-of-languages-2024-05.mdx
index 6a8ec0e..0dddc3a 100644
--- a/posts/advent-of-languages-2024-05.svx
+++ b/posts/advent-of-languages-2024-05.mdx
@@ -5,7 +5,7 @@ draft: true
toc: false
---
-
+import Sidenote from '@components/Sidenote.astro';
I know I said at the beginning that I was most likely not going to get through much of Advent of Code before running out of steam and giving up on the whole different-language-every-day thing, but man, even I wasn't expecting to only make it through 4 days before giving up. That's a new low, even for me.
diff --git a/posts/axes-of-fantasy.svx b/posts/axes-of-fantasy.mdx
similarity index 99%
rename from posts/axes-of-fantasy.svx
rename to posts/axes-of-fantasy.mdx
index 39ce574..9991dbf 100644
--- a/posts/axes-of-fantasy.svx
+++ b/posts/axes-of-fantasy.mdx
@@ -4,10 +4,8 @@ date: 2023-12-26
draft: true
---
-
+import Sidenote from '@components/Sidenote.astro';
+import BookPreview from '@components/BookPreview.astro';
For a while now, I've had a private taxonomy of fantasy books, based on the distinction (or lack thereof) between the fantasy world and our own. It goes something like this:
diff --git a/posts/exposing-docker-containers-to-your-lan.svx b/posts/exposing-docker-containers-to-your-lan.mdx
similarity index 98%
rename from posts/exposing-docker-containers-to-your-lan.svx
rename to posts/exposing-docker-containers-to-your-lan.mdx
index de2274a..98bfb3c 100644
--- a/posts/exposing-docker-containers-to-your-lan.svx
+++ b/posts/exposing-docker-containers-to-your-lan.mdx
@@ -3,9 +3,8 @@ title: Exposing Docker Containers to your LAN
description: If, for some strange reason, you should want to do such a thing.
date: 2022-03-21
---
-
+
+import Sidenote from '@components/Sidenote.astro';
A while back I had occasion to make a number of docker containers directly accessible on the LAN, i.e. without all the usual ceremony of port-forwardism that Docker requires. In retrospect I made it a lot more complicated than it had to be, but I wanted to document the process anyway because you never know when that sort of thing might come in handy.
diff --git a/posts/hitchikers-guide-to-mesh-vpns.svx b/posts/hitchikers-guide-to-mesh-vpns.mdx
similarity index 99%
rename from posts/hitchikers-guide-to-mesh-vpns.svx
rename to posts/hitchikers-guide-to-mesh-vpns.mdx
index d84d2d8..ec15273 100644
--- a/posts/hitchikers-guide-to-mesh-vpns.svx
+++ b/posts/hitchikers-guide-to-mesh-vpns.mdx
@@ -3,9 +3,8 @@ title: The Hitchiker's Guide to Mesh VPNs
description: The golden age of VPNery is upon us.
date: 2022-03-17
---
-
+
+import Sidenote from '@components/Sidenote.astro';
Recently at work we've been moving to a new VPN, and naturally as part of that process we done a bunch of research into the available options before settling on one. Mostly I want to document that for my own future reference, so that if this question comes up again I don't have to go redo it all, but if it ends up being helpful to someone else someday then that's great too. (If I ever get this blog site launched, that is. Currently it's not looking too good.)
diff --git a/posts/imagining-a-passwordless-future.svx b/posts/imagining-a-passwordless-future.mdx
similarity index 96%
rename from posts/imagining-a-passwordless-future.svx
rename to posts/imagining-a-passwordless-future.mdx
index f77a9d6..838bea1 100644
--- a/posts/imagining-a-passwordless-future.svx
+++ b/posts/imagining-a-passwordless-future.mdx
@@ -3,11 +3,10 @@ title: Imagining A Passwordless Future
description: Can we replace passwords with something more user-friendly?
date: 2021-04-30
draft: true
-dropcap: false
+dropcap: 'ascender'
---
-
+
+import Sidenote from '@components/Sidenote.astro';
Passwords are the *worst*.
@@ -33,4 +32,4 @@ and I doubt they'll be going anywhere any time soon.
I really hate passwords.
-I use them, of course, because I can't not. And I use a password manager, because to my mind that's the current best compromise between being secure and absolutely losing your mind, but it still isn't great. Sometimes my password manager bugs out and refuses to auto-fill the password box, so I have to go hunt it down and copy-paste it in.If I'm lucky. If I'm unlucky, the site will have disabled pasting into password inputs because "security," and I'm stuck having to type in a 16-character string of gibberish on a mobile phone, because that's how life is. Other times I'll create a password, the password manager will happily file it away, and then I'll discover that it didn't meet the site's requirements,Another test because my auto-generated gibberish string didn't include the *right* special characters, and now I have the wrong password saved.
\ No newline at end of file
+I use them, of course, because I can't not. And I use a password manager, because to my mind that's the current best compromise between being secure and absolutely losing your mind, but it still isn't great. Sometimes my password manager bugs out and refuses to auto-fill the password box, so I have to go hunt it down and copy-paste it in.If I'm lucky. If I'm unlucky, the site will have disabled pasting into password inputs because "security," and I'm stuck having to type in a 16-character string of gibberish on a mobile phone, because that's how life is. Other times I'll create a password, the password manager will happily file it away, and then I'll discover that it didn't meet the site's requirements,Another test because my auto-generated gibberish string didn't include the *right* special characters, and now I have the wrong password saved.
diff --git a/posts/kubernetes-alternative-wishes.svx b/posts/kubernetes-alternative-wishes.mdx
similarity index 99%
rename from posts/kubernetes-alternative-wishes.svx
rename to posts/kubernetes-alternative-wishes.mdx
index 879d46e..16ed69f 100644
--- a/posts/kubernetes-alternative-wishes.svx
+++ b/posts/kubernetes-alternative-wishes.mdx
@@ -4,9 +4,7 @@ date: 2023-10-01
draft: true
---
-
+import Sidenote from '@components/Sidenote.astro';
I use Kubernetes on my personal server, largely because I wanted to get some experience working with it. It's certainly been helpful in that regard, but after a couple of years I think I can pretty confidently say that it's not the ideal tool for my use-case. Duh, I guess? But I think it's worth talking about _why_ that's the case, and what exactly _would_ be the ieal tool.
diff --git a/posts/languages-fast-and-slow.svx b/posts/languages-fast-and-slow.mdx
similarity index 99%
rename from posts/languages-fast-and-slow.svx
rename to posts/languages-fast-and-slow.mdx
index 89c0a24..08b1690 100644
--- a/posts/languages-fast-and-slow.svx
+++ b/posts/languages-fast-and-slow.mdx
@@ -4,9 +4,7 @@ date: 2026-01-01
draft: true
---
-WORK IN PROGRESS
-
-
+import Sidenote from '@components/Sidenote.astro';
The other day I came across [this post](https://nesbitt.io/2025/12/26/how-uv-got-so-fast.html), and it kind of got my feathers ruffled a little bit.
diff --git a/posts/languages-high-and-low.svx b/posts/languages-high-and-low.mdx
similarity index 97%
rename from posts/languages-high-and-low.svx
rename to posts/languages-high-and-low.mdx
index 6db7e60..2657570 100644
--- a/posts/languages-high-and-low.svx
+++ b/posts/languages-high-and-low.mdx
@@ -5,7 +5,7 @@ date: 2022-08-19
draft: true
---
-
+import Sidenote from '@components/Sidenote.astro';
Here's a fun way to start an argument: Go ask on a programming forum whether C should be considered a "high-level" or "low-level" language. The majority of responses will be along the lines of "low-level, obviously, you have to call `malloc()` all the time", but every once in a while you'll find some crusty old wizard who earned his sripes on MULTICS grousing about how kids these days don't understand what a _real_ low-level language looks like, and back in my day we had to flip individual bits with our teeth, and so on.
@@ -21,4 +21,4 @@ You can probably throw little language-specific details back and forth until the
* **Level 4** languages give you control over things like intermediate variables and so on - there are probably a lot of sub-levels here, like having to instantiate loop variables vs. having them handled for you,Or both! Hi Javascript! but I think this is the core of it. Most dynamic/interpreted languages probably fall here: Python, JS, Ruby, PHP, Perl, etc.
* **Level 5** languages don't give you control over any of those. The only one I can think of off the top of my head is SQL, but there are probably others. I have a hunch that at this point you tend to see a lot more domain-specific stuff, since it's easier to abstract away details when you know what the use-case will look like.
-I can also imagine a Level 0 which gives you control over things that aren't currently exposed by the underlying hardware. For instance, you could have a language construct that allows you to "pin" memory regions to a certain cache level, guaranteeing that you can always access it quickly. Or you could attach a "hint" to a branching codepath that allows you to override the CPU's branch predictor, if you know that one case will be overwhelmingly more common than the other. I wonder whether we'll start to see this sort of thing in the future, as Moore's Law continues to slow down and people start looking for more and more ways to squeeze maximum performance out of their hardware.
\ No newline at end of file
+I can also imagine a Level 0 which gives you control over things that aren't currently exposed by the underlying hardware. For instance, you could have a language construct that allows you to "pin" memory regions to a certain cache level, guaranteeing that you can always access it quickly. Or you could attach a "hint" to a branching codepath that allows you to override the CPU's branch predictor, if you know that one case will be overwhelmingly more common than the other. I wonder whether we'll start to see this sort of thing in the future, as Moore's Law continues to slow down and people start looking for more and more ways to squeeze maximum performance out of their hardware.
diff --git a/posts/mixing-guis-and-clis-on-windows.svx b/posts/mixing-guis-and-clis-on-windows.mdx
similarity index 99%
rename from posts/mixing-guis-and-clis-on-windows.svx
rename to posts/mixing-guis-and-clis-on-windows.mdx
index ee1a2a4..3fc389d 100644
--- a/posts/mixing-guis-and-clis-on-windows.svx
+++ b/posts/mixing-guis-and-clis-on-windows.mdx
@@ -3,7 +3,7 @@ title: 'Mixing GUIs and CLIs on Windows: A Cautionary Tale'
date: 2024-06-17
---
-
+import Sidenote from '@components/Sidenote.astro';
If you've used desktop Linux, then I'm sorry for you.I also use desktop Linux. I'm sorry for me, too. You will, however, most likely be familiar with the practice of using the same app from either the CLI or the GUI, depending on how you invoke it and what you want to do with it. In some cases, the CLI merely replicates the functionality of the GUI, but (due to being, you know, a CLI) is much easier to incorporate in scripts and such. In other cases ([Wezterm](https://wezfurlong.org/wezterm/) is a good example) the GUI app acts as a "server" with which the CLI communicates to cause it to do various things while it runs.
diff --git a/posts/passwords-and-you.svx b/posts/passwords-and-you.mdx
similarity index 98%
rename from posts/passwords-and-you.svx
rename to posts/passwords-and-you.mdx
index fd8265d..bd3b90a 100644
--- a/posts/passwords-and-you.svx
+++ b/posts/passwords-and-you.mdx
@@ -3,9 +3,8 @@ title: Password Strength, Hackers, and You
date: 2023-10-21
draft: true
---
-
+
+import Sidenote from '@components/Sidenote.astro';
Every once in a while, as my friends and family can attest, I go off on a random screed about passwords, password strength, password cracking, logins, etc. To which they listen with polite-if-increasingly-glassy-eyed expressions, followed by an equally polite change of conversational topic. To avoid falling into this conversational tarpit _quite_ so often, I've decided to write it all up here, so that instead of spewing it into an unsuspecting interlocutor's face I can simply link them here.Maybe I can get business cards printed, or something. Whereupon they can say "Thanks, that sounds interesting," and proceed to forget that it ever existed. So it's a win-win: I get to feel like I've Made A Difference, and they don't have to listen to a half-hour of only-marginally-interesting infosec jargon.
diff --git a/posts/sidenotes.svx b/posts/sidenotes.mdx
similarity index 89%
rename from posts/sidenotes.svx
rename to posts/sidenotes.mdx
index ff1e745..9acaf56 100644
--- a/posts/sidenotes.svx
+++ b/posts/sidenotes.mdx
@@ -4,64 +4,9 @@ description: An entirely-too-detailed dive into how I implemented sidenotes for
date: 2023-08-14
draft: true
---
-
-
+import Sidenote from '@components/Sidenote.astro';
+import UnstyledSidenote from '@components/UnstyledSidenote.astro';
One of my major goals when building this blog was to have sidenotes. I've always been a fan of sidenotes on the web, because the most comfortable reading width for a column of text is far less than the absurd amounts of screen width we tend to have available, and what else are we going to use it for?Some sites use it for ads, of course, which is yet another example of how advertising ruins everything.
@@ -81,7 +26,7 @@ My first approach was something like this:
.sidenote {
position: absolute;
/* 50% takes us to the midpoint of the page,
- half of content-width gets out out to the gutter,
+ half of content-width gets out out to the gutter,
and the extra 1rem gives us some breathing room. */
left: calc(50% + var(--content-width) / 2 + 1rem);
max-width: 12rem;
@@ -89,7 +34,7 @@ My first approach was something like this:
}
```
-And it worked! Sort of. Here's an example.My initial take on sidenotes. Seems to be working, right? Unfortunately it has a major flaw: Absolute positioning removes an element from the document flow _entirely_, while I wanted sidenotes to still flow with _each other_, That doesn't happen with this solution--if you have multiple sidenotes too close together, they will overlap because absolute positioning Just Doesn't Care.Like this one.And this one, which I've moved down just a smidge to make the overlap more apparent.
+And it worked! Sort of. Here's an example.My initial take on sidenotes. Seems to be working, right? Unfortunately it has a major flaw: Absolute positioning removes an element from the document flow _entirely_, while I wanted sidenotes to still flow with _each other_, That doesn't happen with this solution--if you have multiple sidenotes too close together, they will overlap because absolute positioning Just Doesn't Care.Like this one.And this one, which I've moved down just a smidge to make the overlap more apparent.
Obviously, it isn't that hard to just scan through the page looking for sidenotes, detect when they overlap, and then (since they're already absolutely positioned) adjust their `top` values appropriately to get rid of the overlap. But I didn't want to do this for a variety of reasons.
@@ -140,7 +85,7 @@ body {
content: counter(unstyled-sidenote);
font-size: 0.75rem;
color: var(--accent-color);
- /* Since the sidenote is floated it counts as a positioned element,
+ /* Since the sidenote is floated it counts as a positioned element,
so this would make the counter overlap the start of the text... */
position: absolute;
/* ...except that we move it out to the left and up a bit, so
@@ -165,7 +110,7 @@ This is easiest to show with an example, so let's do that. Here are two sidenote
This is fixed by `clear` because it changes the behavior of floats. Here are the same two sidenotes as above, but with `clear: right` applied to the second.One.Two. The `clear` property causes the second sidenote to drop below the first, which happens to be exactly the behavior that we want. All that's left is to apply the negative margin like soThree.Four.and the whole stack will slide right over into the gutter.
-It's smack up against the body text, though. In fact, since the floating counter hangs off to the left, it actually overlaps with the body text.(Depending on line wrapping, this may not be immediately apparent from the above.)
+It's smack up against the body text, though. In fact, since the floating counter hangs off to the left, it actually overlaps with the body text.(Depending on line wrapping, this may not be immediately apparent from the above.)
We can fix that in one of two ways. 1) We can increase the negative margin so that it's _greater_ than the width of the sidenote, or 2) We can just stick in some padding.Voila! Collision avoided. I like the first option better, because it better reflects what we're actually doing here--margin is for creating caps _outside_ and _between_ elements, while padding is for gaps _inside_.
@@ -179,7 +124,7 @@ Here's what we have so far:
}
```
-We still have a bit of a problem, though. Because we've assigned the sidenote a fixed width, it doesn't automatically shrink when the window gets too small for it. Obviously, of course, at _some_ point we're going to switch to the mobile version, which displays at the bottom of the screen and can be toggled on or off. But there are plenty of widths where sidenotes would still work perfectly well, just with a slightly narrower width than our initial `14rem`.
+We still have a bit of a problem, though. Because we've assigned the sidenote a fixed width, it doesn't automatically shrink when the window gets too small for it. Obviously, of course, at _some_ point we're going to switch to the mobile version, which displays at the bottom of the screen and can be toggled on or off. But there are plenty of widths where sidenotes would still work perfectly well, just with a slightly narrower width than our initial `14rem`.
Fortunately, CSS `calc()` is widely supported and does exactly what we need.Here we are! You may need to resize your window to get full effect. Let's take a look:
diff --git a/posts/simpler-socketio.svx b/posts/simpler-socketio.mdx
similarity index 100%
rename from posts/simpler-socketio.svx
rename to posts/simpler-socketio.mdx
diff --git a/posts/ssh-key-formats.svx b/posts/ssh-key-formats.mdx
similarity index 97%
rename from posts/ssh-key-formats.svx
rename to posts/ssh-key-formats.mdx
index 5ef2b24..54ab53d 100644
--- a/posts/ssh-key-formats.svx
+++ b/posts/ssh-key-formats.mdx
@@ -3,9 +3,7 @@ title: 'Converting ssh keys from old formats'
date: 2024-07-06
---
-
+import Sidenote from '@components/Sidenote.astro';
Like a lot of people, my main experience with private keys has come from using them for SSH. I'm familiar with the theory, of course - I know generally what asymmetric encryption does,Although exactly _how_ it does so is still a complete mystery to me. I've looked up descriptions of RSA several times, and even tried to work my way through a toy example, but it's never helped. And I couldn't even _begin_ to explain elliptic curve cryptography beyond "black math magic". and I know that it means a compromised server can't reveal your private key, which is nice although if you only ever use a given private key to SSH into your server and the server is already compromised, is that really so helpful?Yes, yes, I know that it means you can use the same private key for _multiple_ things without having to worry, but in practice a lot of people seem to use separate private keys for separate things, and even though I'm not entirely sure why I feel uncomfortable doing otherwise.
@@ -46,7 +44,7 @@ It also dates back to a time when manpages were the primary way of communicating
```
-i This option will read an unencrypted private (or public) key file in the format specified by the -m option and print an
OpenSSH compatible private (or public) key to stdout. This option allows importing keys from other software, including
- several commercial SSH implementations. The default import format is “RFC4716”.
+ several commercial SSH implementations. The default import format is "RFC4716".
```
Sounds great, right? Import private keys from other formats, i.e. convert them to our format, right? But it's _lying_. The `-i` mode doesn't accept private keys _at all_, that I've been able to tell, whatever their format. Giving it one will first prompt you for the passphrase, if any (so it's lying about needing an unencrypted input, although that's not a big deal) and then tell you bluntly that the your file is not in a valid format. The specific error message varies slightly with the particular format - attempting to give it a PEM file (with the appropriate option) returns ` is not a recognized public key format`, PKCS8 gets `unrecognised raw private key format`, and speicfy OpenSSH format just says `parse key: invalid format`. So really, the only thing this mode is useful for is reading a _public_ key in some PEM-ish format, and spitting out the line that you can used in `authorized_keys` - the one that starts with `ssh-rsa`, `ssh-ed25519`, etc.
@@ -59,9 +57,9 @@ But wait! The `-i` option mentions that the formats accepted are specified by th
-m key_format
Specify a key format for key generation, the -i (import), -e (export) conversion options, and the -p change passphrase
operation. The latter may be used to convert between OpenSSH private key and PEM private key formats. The supported
- key formats are: “RFC4716” (RFC 4716/SSH2 public or private key), “PKCS8” (PKCS8 public or private key) or “PEM” (PEM
+ key formats are: "RFC4716" (RFC 4716/SSH2 public or private key), "PKCS8" (PKCS8 public or private key) or "PEM" (PEM
public key). By default OpenSSH will write newly-generated private keys in its own format, but when converting public
- keys for export the default format is “RFC4716”. Setting a format of “PEM” when generating or updating a supported pri‐
+ keys for export the default format is "RFC4716". Setting a format of "PEM" when generating or updating a supported pri‐
vate key type will cause the key to be stored in the legacy PEM private key format.
```
diff --git a/posts/sufficiently-advanced-technology-magic.svx b/posts/sufficiently-advanced-technology-magic.mdx
similarity index 99%
rename from posts/sufficiently-advanced-technology-magic.svx
rename to posts/sufficiently-advanced-technology-magic.mdx
index 2699c21..d337694 100644
--- a/posts/sufficiently-advanced-technology-magic.svx
+++ b/posts/sufficiently-advanced-technology-magic.mdx
@@ -4,9 +4,8 @@ description: I see what Arthur C. Clarke was getting at, but I don't think I agr
date: 2022-05-14
draft: true
---
-
+
+import Sidenote from '@components/Sidenote.astro';
Arthur C. Clarke is famous for many things, among them being his dictum that "Sufficiently advanced technology is indistinguishable from magic."Which I had always thought of as "Clarke's Law", I looked it up when I went to write this and discovered that it's actually Clarke's _Third_ Law. Apparently he has two others. I don't know that I've ever run into them, though. Maybe he should have led with this one? I'm often happy to take issue with Clarke's opinions, so today I want to put this one on the chopping block.
diff --git a/posts/the-enduring-shell.svx b/posts/the-enduring-shell.mdx
similarity index 98%
rename from posts/the-enduring-shell.svx
rename to posts/the-enduring-shell.mdx
index 150961a..43fd4d1 100644
--- a/posts/the-enduring-shell.svx
+++ b/posts/the-enduring-shell.mdx
@@ -3,9 +3,8 @@ title: The Enduring Shell
date: 2023-11-26
draft: true
---
-
+
+import Sidenote from '@components/Sidenote.astro';
Over twenty years ago, Neal Stephenson wrote an essay/pamphlet/novella/whatever-you-want-to-call-it titled [_In the beginning was the Command Line_](http://project.cyberpunk.ru/lib/in_the_beginning_was_the_command_line/). It's worth reading, and you should definitely do that at some point, but you should finish this first because it's quite long and Neal Stephenson is a much better writer than I am, so I worry you wouldn't come back.I should probably also mention that it's Stephenson at his, ah, least restrained, so it's rather meandering. Don't get me wrong, it's _well-written_ meandering, but I don't think you can argue that an essay about command lines isn't meandering when it includes a thousand-word segment about Disney World. As you might expect, Stephenson spends a lot of that material talking about the CLI versus the GUI, as though they were opposite poles of some abstract computational magnet. It's been a while since I read it, but I distinctly remember him describing the advent of the GUI as a sort of impending inevitability, an unfortunate but unstoppable end to which all things in time will eventually come. It's a little like watching [_Valkyrie_](https://www.imdb.com/title/tt0985699/), actually--you know whe whole time how it's going to turn out, but you can't keep yourself from watching it anyway.
diff --git a/posts/vue-vs-svelte.svx b/posts/vue-vs-svelte.mdx
similarity index 99%
rename from posts/vue-vs-svelte.svx
rename to posts/vue-vs-svelte.mdx
index 5da646e..873d2cd 100644
--- a/posts/vue-vs-svelte.svx
+++ b/posts/vue-vs-svelte.mdx
@@ -3,9 +3,8 @@ title: Thoughts on Vue vs Svelte
description: They're more similar than they are different, but they say the most bitter enemies are those who have the fewest differences.
date: 2023-06-29
---
-
+
+import Sidenote from '@components/Sidenote.astro';
Recently I've had a chance to get to know Vue a bit. Since my frontend framework of choice has previously been Svelte (this blog is built in Svelte, for instance) I was naturally interested in how they compared.
diff --git a/posts/why-the-internet-is-terrible.svx b/posts/why-the-internet-is-terrible.mdx
similarity index 99%
rename from posts/why-the-internet-is-terrible.svx
rename to posts/why-the-internet-is-terrible.mdx
index 6380f51..705dae6 100644
--- a/posts/why-the-internet-is-terrible.svx
+++ b/posts/why-the-internet-is-terrible.mdx
@@ -3,7 +3,7 @@ title: Why the Internet is Terrible
date: 2024-11-16
---
-
+import Sidenote from '@components/Sidenote.astro';
I just got done deleting ~30 bogus user accounts from my [personal Gitea insteance](https://git.jfmonty2.com). They all had reasonable-ish-sounding names, one empty repository, and profiles that looked like [this](/bogus_user_profile.jpg). Note the exceedingly spammy link to a real site (still up as of writing) and the ad-copy bio.