Exa's Corner
Hi! We’re Exa, Java developers and *n{i,u}x sysadmins since 2009.
We’re primarily known for Minecraft mods, but do various other things too — such as hosting/overseeing the Sleeping Town community, and the Jortage hosting project.
This is our personal website and home of our “digital garden” — a place for us to chuck all manner of random things without having to think about “deployment”, “revisions”, or “standards”. It’s especially useful for what amounts to low-friction blogging.
This is a living site with hot reload. Stuff may change as you’re reading it, if we are writing it at the same time. Exciting.
We write open source code and run free online services full-time. Please pitch in if you can:
You can join in discussion of our projects and various other faff — same community, they’re bridged:
You can find us in various other places, too:
We’ve been daily driving Linux and BSD since 2013, and using both for servers since 2009, while writing dizzying amounts of Java code indented with tabs.
Random things we’ve made or are responsible for that otherwise would not be linked from anywhere:
- Assorted GPIO pinout diagrams for uncommon SBCs we’ve used, and Raspberry Pi ones for reference
- A colorspace toy
- SCP-style laptop sticker generator
- Pie-chart SVGs
- Welon, a web-based Suika Game clone
- Server status (powered by Uptime Kuma)
- Our own instance of Drasl, an alternative Minecraft authentication server
Finally, below you can see all our garden pages and old blog posts. It’s a bit of a mess in here. That’s the point. We’re always learning, and hopefully so are you. That’d be why you’re here, yes?
Document Listing
Computering
-
Backups (Restic + btrfs) — They're important!!!!
-
JVM Arguments — Say no to snake oil
-
What's New Since Java 21 — A quick summary of what has landed between Java 21 and 25
-
Migrating Git repos to SHA-256 — This is so extremely underdocumented!!
-
Static Site Generation — Wherein my blog is a huge mistake
-
Eleventy — The thing that generates this garden.
-
Ogg Album Art & FFmpeg — Album art is easy, right? Haha WRONG
-
Djot — Markdown but it isn't Markdown
-
Rimraf — Delete all your data with this one easy trick!
Development
-
AI Policy — tl;dr: No. Never.
-
.java-version — What's that mystery clutter in our projects
-
CSS Level 5 — Relative colors are cool!
-
On Secret Features — Why hide things in an open source project?
-
TeaVM — Assorted notes about TeaVM, a Java-to-JS/WASM transpiler
-
Localize Early — It will save you time.
Hardward
-
V6 vs MK8 — Please don't destroy your 3D printer like me
-
"Hardward" — Why is this category misspelled
Lists
-
Android Apps — Things we use
-
Good Posts — Go read someone else's stuff
Meta
-
Announcement Feeds — Get informed when stuff happens with our projects
-
Digital Gardening — What's this site?
Projects
-
Pluraldawn — Parse indicator emojis in various Fediverse webapps
-
PluralKitIntegration for Vencord — Break the Discord ToS and improve your PluralKit user experience
Rants
-
Eclipse Has Never Changed — And this is good
-
Autodesk Pricing is Obscene — Greedy-ass monopolies
The Linux Desktop
-
Wayland — The worse Linux desktop server
-
PipeWire — The better Linux sound server
-
OVMF GPU Passthrough — The time I made an nVidia Windows VM
Tools
-
Browser Data — Random stuff I sometimes want to know
-
Color Palette — Do you like Material Design 1.0?
-
Delicious Content — Crawler trap. Don't click here
zOld Blog Posts
-
So, here's how FoamFix works — People have been wondering what exactly FoamFix does. So, here it is.
-
Installing Ghost the hard way — I get angry about a trend in server hosting and software development and go on a petty crusade to rectify one particular instance of it. Also, I ramble about a blog... on a blog.
-
The Tragedy of UCS-2 — Apropos of nothing, I'd like to tell you a tale. It's not an original tale, but it's one of my favorites.
-
Virtual machines, physical pain — The term "virtual machine" refers to two distinct and quite different concepts. People often confuse one with the other and wrongly assume quite a few things. Let's break it down: what does "virtual machine" really mean?
-
I ported xoshiro256** to Java so you don't have to — My port has zero dependencies, works on Java 8, extends Random, and is released under the CC0 just like the original C implementation.
-
To Audio & Back Again - Audio codecs as image codecs — If you're anything like me, you've wondered what would happen if you used a compression algorithm for something it was not designed for.
index.dj
---
layout: default.njk
title: Exa's Corner
noindexlink: true
---
[*Hi!* [We're](/about/) [Exa]{.purpley}, Java developers and [`*n{i,u}x`{lang=php % looks better than bash %}]{title="Shell glob that matches Linux and Unix"} sysadmins since 2009.]{.big}
``` =html
<script>document.querySelectorAll('.pronounce').forEach(e => e.addEventListener('click', v => { e.querySelector('audio').play(); v.preventDefault(); }))</script>
```
We're primarily known for Minecraft mods, but do various other things too — such as hosting/overseeing the [Sleeping Town](https://sleeping.town) community, and the [Jortage](https://jortage.com) hosting project.
This is our personal website and home of our [_"digital garden"_](/garden/) — a place for us to chuck all manner of random things without having to think about "deployment", "revisions", or "standards". It's especially useful for what amounts to low-friction blogging.
::: yesscript
This is a living site with hot reload. Stuff may change as you're reading it, if we are writing it at the same time. Exciting.
:::
::: noscript
If JavaScript were enabled, then this site would hot reload whenever we update pages, and you would be able to see last-modified times.
:::
::::locales
----
*We write open source code and run free online services full-time. Please pitch in if you can:*{.big}
:::locale-group
[
[][helcim-logo]
*Helcim*
[]{}
[direct card/ACH (preferred)]{}
[]{}
](https://donate.unascribed.com/){
style="--color: #815af0"
}
[
[][patreon-logo]
*Patreon*
[]{}
[if you already use it]{}
[]{}
](https://patreon.com/unascribed){
style="--color: #f96854"
}
[
[][liberapay-logo]
*Liberapay*
[]{}
[if you already use it]{}
[]{}
](https://liberapay.com/unascribed){
style="--color: #f6ca0d"
}
[
[][paypal-logo]
*PayPal*
[]{}
[if you dislike the others]{}
[]{}
](https://paypal.me/unadeer){
style="--color: #00457c"
}
{# padding for flexbox wrapping #}
[]{}[]{}[]{}[]{}[]{}
:::
----
You can join in discussion of our projects and various other faff — same community, they're bridged:
:::locale-group-centerjoin
[
[][matrix-logo]
*Matrix Space*
](https://matrix.to/#/#exaptations:sleeping.town){
style="--color: #FFF"
rel=me
id="matrix-space"
}
[
[][discord-logo]
*Discord Guild*
](https://discord.y2k.diy){
style="--color: #5865F2"
rel=me
id="discord-guild"
}
:::
You can find us in various other places, too:
:::locale-group-small
[
[
[][mastodon-logo]
*Mastodon*
]{}
[ramblings]{}
](https://sleeping.town/@exa){
style="--color: #6364FF"
rel=me
}
[
[
[][forgejo-logo]
*Forgejo*
]{}
[source code]{}
](https://git.sleeping.town/unascribed){
style="--color: #ca3500"
rel=me
}
[
[
[][modrinth-logo]
*Modrinth*
]{}
[minecraft mods]{}
](https://modrinth.com/user/exaptations){
style="--color: #1bd96a"
rel=me
}
[
[
[][curseforge-logo]
*CurseForge*
]{}
[minecraft mods{^2^}]{}
](https://legacy.curseforge.com/members/exaptations/projects){
style="--color: #F16436"
rel=me
}
[
[
[][peertube-logo]
*PeerTube*
]{}
[rare video uploads]{}
](https://tube.sleeping.town/c/unascribed_channel){
style="--color: #f2690d"
rel=me
}
[
[
[][matrix-logo]
*Matrix*
]{}
[main chat]{}
](https://matrix.to/#/@unascribed:sleeping.town){
style="--color: #FFF"
rel=me
}
[
[
[][email-icon]
*Email*
]{}
[reliable (not fast)]{}
](mailto:[email protected]){
style="--color: #CCA"
rel=me
}
[]{}
[
[
[][discord-logo]
*Discord*
]{}
](https://discord.com/users/154058479798059009){
.discouraged
style="--color: #5865F2"
rel=me
}
[
[
[][twitch-logo]
*Twitch*
]{}
](https://twitch.tv/unascribed){
.discouraged
style="--color: #6441a5"
rel=me
}
[
[
[][github-logo]
*GitHub*
]{}
](https://github.com/unascribed){
.discouraged
style="--color: #222"
rel=me
}
[
[
[][youtube-logo]
*YouTube*
]{}
](https://youtube.com/@unascribed){
.discouraged
style="--color: #C02"
rel=me
}
[]{}
[
[
[][reddit-logo]
*Reddit*
]{}
](https://old.reddit.com/user/unascribed){
.discouraged
style="--color: #FF5700"
rel=me
}
[
[
[][tumblr-logo]
*Tumblr*
]{}
](https://tumblr.com/unascribed){
.discouraged
style="--color: #36465D"
rel=me
}
[
[
[][codeberg-logo]
*Codeberg*
]{}
](https://codeberg.org/unascribed){
.discouraged
style="--color: #4793cc; --message: 'UNUSED'"
rel=me
}
[]{}[]{}[]{}[]{}[]{}
:::
::::
----
We've been daily driving Linux and BSD since 2013, and using both for servers since 2009, while writing dizzying amounts of Java code indented with tabs.
Random things we've made or are responsible for that otherwise would not be linked from anywhere:
* Assorted [GPIO pinout diagrams](https://gpio.y2k.diy/) for uncommon SBCs we've used, and Raspberry Pi ones for reference
* A [colorspace toy](/junk/colorspaces.html)
* [SCP-style laptop sticker generator](https://scp.y2k.diy/)
* [Pie-chart SVGs](/pie/)
* [Welon](https://welon.y2k.diy/), a web-based Suika Game clone
* [Server status](https://status.unascribed.com/) (powered by Uptime Kuma)
* Our own [instance of Drasl](https://mcauth.sleeping.town), an alternative Minecraft authentication server
----
Finally, below you can see all our garden pages and old blog posts. It's a bit of a mess in here. _That's the point_. We're always learning, and hopefully so are you. That'd be why you're here, yes?
``` =html
<h2>Document Listing</h2>
<input class="yesscript" id="show-stars" type="checkbox"><label class="yesscript" for="show-stars"> Show stars next to entries you haven't read, or have been updated since you last read them</label>
{%- for k in collections | keysExceptAll | sort -%}
<h3 id="{{k | lower}}">{{k}}</h3>
<ul class="index-pages">
{%- for p in collections[k] | sortByActualModifiedTime -%}
<li class="{{p.data.classes}}">
<div><a href="{{p.url}}">{{p.data.title}}</a> — {{p.data.description}}</div>
<time class="page-update yesscript" data-url="{{p.url}}" datetime="{{p.data | mtime | toISO}}"></time>
</li>
{%- endfor -%}
</ul>
{%- endfor -%}
{{blank}}
```
[helcim-logo]: 8< snip: raw image data
[patreon-logo]: 8< snip: raw image data
[liberapay-logo]: 8< snip: raw image data
[paypal-logo]: 8< snip: raw image data
[mastodon-logo]: 8< snip: raw image data
[forgejo-logo]: 8< snip: raw image data
[streaming-video-icon]: 8< snip: raw image data
[peertube-logo]: 8< snip: raw image data
[matrix-logo]: 8< snip: raw image data
[email-icon]: 8< snip: raw image data
[discord-logo]: 8< snip: raw image data
[twitch-logo]: 8< snip: raw image data
[github-logo]: 8< snip: raw image data
[youtube-logo]: 8< snip: raw image data
[reddit-logo]: 8< snip: raw image data
[codeberg-logo]: 8< snip: raw image data
[esper-logo]: 8< snip: raw image data
[oftc-logo]: 8< snip: raw image data
[modrinth-logo]: 8< snip: raw image data
[curseforge-logo]: 8< snip: raw image data
[tumblr-logo]: 8< snip: raw image data
[una.opus]: /static/pronounce/una.opus
[unascribed.opus]: /static/pronounce/unascribed.opus