pyro is game server hosting for people who got tired of every host being slow, ugly, and slightly hostile. minecraft, cs2, rust, ark, palworld, 40+ games, one click to switch between them.
it started as a personal project years ago and turned into the company i run. the pitch is simple: put servers on the fastest hardware we can buy, wrap it in a panel that respects your time, and stop nickel-and-diming people for backups.
what that means in practice:
we also built modrinth servers, the official hosting for the modrinth community, which has since moved to new ownership. building infrastructure other companies trust enough to put their name on is the part i am most proud of.
the honest part: hosting is a business where the only time anyone notices you is when something breaks. the work is making sure that almost never happens, and being awake when it does.
checksum.space is the thing you are looking at. it boots, it has a menu bar, and every project and post is a window you can open, move, and close. i got tired of portfolios that are one long scroll of the same hero section, so i made an operating system instead.
how it is built:
zero javascript ships until you actually open something. the desktop is the interface and the source is the resume. it is overbuilt on purpose, which is the nicest thing i can say about any side project.
sapphire is the vtuber stack i wanted and could not find: face and motion tracking, model customization, and the live tooling all under one roof, instead of stitching together five programs that each break in their own way.
it is in active development and currently private. i stream behind it, which is the best possible way to find bugs, since every one of them happens live in front of an audience.
checksum.tv is a boutique vtuber talent agency. the whole idea is to stay small and actually care: grow talent through community rather than treating people like content units to be scheduled and squeezed.
it draws on everything else i build, since the talent runs on tools like sapphire and streams the same way i do. small agency, real people, no growth-hacking.
estrogen.charity is the thing i am building because the system for accessing hrt is hostile by design and i have the skills to chip at it. the goal is narrow and concrete: make the path to getting on estrogen shorter, clearer, and less expensive.
it is not live yet, just an idea i am building toward. i would rather ship something small that helps one person than announce something huge that helps nobody. a link goes here the day there is something real to click.
clavis is an async rust library for encrypted network communication, built on xchacha20-poly1305. the goal is a small surface you cannot easily hold wrong: secure by default, async-native, and boring in the way crypto should be.
the technical decision i would defend to the death: authenticated encryption is not optional and should not be a checkbox. clavis does not ship a mode that lets you turn it off.
emoteslicer automates the boring half of emote work: slicing, sizing, and laying out panels so creators stop doing it by hand in an image editor at 2am.
a finished, useful little thing that does one job and gets out of the way. that is the whole bar for a tool like this, and it clears it.
ezsymlink is a small cross-platform gui for creating and managing symbolic links. symlinks are useful and the command for them is impossible to remember, so this is the button that does it for you on whatever os you are on.
unglamorous and complete. some software just needs to exist so you never have to read the man page again.
modrinth servers is the official hosting product for modrinth, the open-source mod platform. we built it at pyro so that finding a modpack and running it could be the same motion: pick the pack, get a server, done. no manual jar wrangling, no version roulette.
it has since moved to new ownership, so it is no longer ours to operate. it stays on this list because building hosting that a platform trusts with its own name is a different bar than building it for yourself, and we cleared it.
beatforge was a modern mod distribution platform for beat saber, built to make finding and installing mods fast and painless instead of a forum-thread scavenger hunt.
it is paused, not deleted. the code and the site are still up, and i learned a lot about what a good mod platform has to get right by building one that mostly did.
lumen is a sharex image uploader written in rust, built to be fast and secure where most uploaders are neither. screenshot, upload, link in your clipboard before you finish letting go of the hotkey.
paused now, but it did exactly what it promised and it taught me rust the way only shipping something does.
hikari was an anime streaming service built around the idea that the player and the ux should be the good part, not the afterthought wrapped in ads.
i built it and later transferred it to new ownership, so it is no longer mine to run. it stays here because it was a real product with real users and i am still proud of how it felt to use.
translator encodes binary data as lgbtqia+ pride flag patterns. half art project, half real encoder: your data goes in, flags come out, and it round-trips back.
discontinued and left up as-is. some projects are just a good idea you had to see through to the end to prove it worked.
wysibot watched beat saber gameplay for 727 moments and posted them. it was a joke that the community got, which is the only reason a bot like this is worth building.
discontinued now. it did its one stupid wonderful job and then the platform changed under it, as platforms do.
banchoxide was a private osu! server written in rust, built to see how fast and lean a bancho implementation could be if performance was the goal from line one.
discontinued, and one of the early projects that turned rust from a language i was learning into the one i reach for. it served its purpose twice over.
you have seen my portfolio before. not mine specifically, the shape of it. centered hero, a
gradient blob doing nothing, three cards with rounded corners and lucide icons, the whole
thing fading up as you scroll. a generator spits that out in four seconds. it is fine. it is
also forgettable: i looked at a hundred of them for research and i cannot name one. so i
wrote a single rule before i wrote any code. if this site could pass for a v0 export, i
failed. ![]()
“not slop” is a low bar though, and an embarrassing thing to aim for. the harder question was what the thing should actually be. i did not want it to list me. anybody can list themselves. i wanted you to catch me in the act: the track playing right now, the projects i abandoned sitting next to the ones that shipped, the notes i scribbled down before i lost them.
so the site is my brain. specifically, my brain if it ran as an operating system.
it did not start here. the first plan was a room. a pixel-art diorama of my desk, an avatar
living in it, lights dimming when i fell asleep, a sticky note on the door when i stepped
out. i specced the whole thing. i still think it would have been gorgeous, and i’m a little
annoyed i didn’t build it. ![]()
i killed it because a room is something you look at, and that’s the entire interaction. it knows where i am and what i’m doing, then it just sits there being pretty. there’s nowhere to put me in it except on another shelf. an os you actually do things to. you open it, close it, dig through it, stack things up and knock them over. so the cozy desk got demoted to one diorama running inside the machine, and the machine became the whole site.
one rule: if a feature can’t be expressed as something a real os does, a window, a tray item, a command palette, a status light, it doesn’t ship. no “but it’d be cool if.”
that constraint did the design for me. a blank canvas makes you invent the rules and the
content at once, which is how the gradient-blob people get where they get. an os hands you
the grammar for free. i stopped asking how to present my projects and started asking what an
app launcher does, which is a question with an answer. cmd+k opens a command palette,
obviously. type “music” and a window opens showing whatever i’m actually listening to,
pulled live off last.fm. there is no hero section. name one desktop with a hero section.
![]()
the rule takes things away too. nearly every portfolio opens on an about page: your face, a paragraph, hello here is who i am, before you asked for any of it. mine can’t. an os does not boot into a bio. it logs you in as me and leaves the about page as just another app, “about this machine,” sitting there until you go looking. i am not going to read myself to you in the doorway.
windows were the part i knew would hurt, and i walked in anyway. draggable, resizable, persistent across reloads, and every one of those is a fresh way to feel broken on a phone.
z-index alone ate days, and the bug is genuinely stupid: let the top window’s z climb unchecked and eventually it laps the menu bar and renders on top of my own chrome. so windows live in a band, 10 to 800. the chrome sits above 1000, permanently out of reach. and when the top window creeps toward 800, the whole stack gets renumbered from the floor so it never crosses into the chrome’s territory. the machine tidying up after itself.
dragging was the other fight, though the fix is the boring well-known one: don’t drag through react. move a window by setting state and the reconciler wakes up mid-gesture wanting to re-render, and a 60fps drag turns to slush. so during a drag, react doesn’t get a vote. cache the geometry on pointerdown, write straight to the dom on every frame, and tell the store where the window landed only once you let go.
then the smaller indignity: resize your browser and half your windows are suddenly off-screen. so on boot the layout restores from localstorage and clamps every window back into view, because the screen you left might not be the screen you came back on.
honestly i spent more time on focus order and pointer math than on anything a visitor came to read. over-built chrome, under-built content.
here’s the part the genre usually gets wrong, though. os-portfolios almost always die the second you open them on a phone or reach for a keyboard. so the real work wasn’t the dragging, it was making the dragging optional. the default is one window, full size. strip dragging out completely and the windows still open, still take focus in a sane order, and the writing underneath is real semantic html instead of something painted on a canvas. on a phone the metaphor just becomes a phone os: full-screen apps, a bottom bar. i built that version first and bolted dragging on top for whoever showed up with a mouse.
astro holds the shell, so most of the page is static html the browser barely has to think
about. react only wakes up for the parts that have to be alive: the window manager, the
palette, the music and feed widgets, the presence sprite. each post and project is rendered
to html at build time and parked in a hidden <template> tag; the window pulls it out by id
when you open it. the content ships as plain html and gets parsed once, and i pay for that
in a heavier initial page. for a personal site that is a trade i’ll take. it also means this
window, the one you’re reading in, is a markdown file that got poured into window chrome on
the way to you. i write the site the same way i write in it. ![]()
the presence widget is my favorite thing here and nobody asked for it. a little rust agent on my desktop watches how long i’ve been idle, whether the screen is locked, what time it is, and grades me from that: active, idle, away, asleep. it guesses what i’m up to from whatever app is in front, coding or gaming or watching something. the part i actually care about is what it won’t send. no window titles, no file paths, no keystrokes, just the grade. the server throws out anything incoherent on the way in, so it will reject a payload that says i’m asleep and coding at the same time. i’m flattered, but no. my phone runs a second agent that does the geofencing on-device and sends a single bit, home or away. that is the whole location story.
it is wildly overbuilt for a personal site, which is the point. anyone can tell you they can
build things. so instead here is the thing itself, and you can poke it until something
gives. i would rather give you the computer than the brochure. ![]()