Cammy's Big Rambly Journal

Archived 2025 entries


Hello! I notice you're using Netscape (or other CSS-noncompliant user agent—in which case, consider this an easter egg) to view this journal. Because Netscape is so titanically shit, I have disabled image viewing on Netscape specifically. If I didn't, you would notice random images being replaced with each other and similar such strangeness. The posts are still visible, but you'll be missing the images, which are half the context of these posts.

You should use RetroZilla if you can; it runs on Windows 95 and up and gives you a perfect cammy.somnol viewing experience, plus more comfortable Web browsing on retrocomputers in general. Failing that, Internet Explorer 3 (which amusingly also displays this message, since it doesn't support the display CSS property) and up will also work perfectly fine for seeing my journal posts.


May 06, 2025
The DocBook Deployment, day one

SeXML and CockBook, hoho


I've had the idea kicking around for a few months now, but it's finally come time to put it into action: stories deployed on all three of my websites from a single source file. The issue with nofi/lofi/hifi is that it takes some novel ideas to synchronize content across all three. Even though my stories don't change a whole lot once they're posted, the fact that I need to maintain three different versions of the markup for each (owing to nofi using no CSS and lofi and hifi using different CSS), even with the help of AutoSite, has put me off writing more. That's just a lot of busywork—and for everything that's on these sites, plain text stories should be on all three.

I initially conceived of a system using PHP and databases, like my album reviews, but what makes sense for two paragraphs and a bunch of little data around it doesn't line up for more longform writing where the HTML changes so oten. I started scouring around for typesetting and documentation systems that would translate easily to the Web and I settled on DocBook, which is XML-based. This means that the conversion to HTML is, ideally, 1:1, everything that can be represented in the output HTML document has a place in the original DocBook file. Because it's XML, and all XML-based languages are interoperable assuming your document is well-formed and your namespaces are in order, you can use a standard XML processing language like XSLT to turn DocBook into HTML.

If that's a lot of jargon for you, the plain English version here is that I'm using a format for the book that I can easily turn into other things. That doesn't just include website stuff, there's all sorts of tools and converters to turn a DocBook document into eBooks or PDFs or whatever else. It's a good, long-term format to bet on for storing my writing, but in the short term, I just want stories on my sites again.

How I'm planning the workflow

Ideally, I want the conversion process to be as hassle-free as possible. I'd like to get the story into the right format, run a script to generate the necessary three versions, one for each flavor of mari.somnol, and then upload the files. Actually, it's more like six versions—one of my requirements is that I'd like stories that are segmented (like Kevin and Theo's Multiverse Misadventure, which I've been using as a test case for figuring out the tools) to also be viewable as a single page, if your retro computer or device can handle it.

To make things even simpler, I'd like to convert not to finalized HTML, but to AutoSite input pages that I can easily slipstream into the existing AutoSite projects that nofi, lofi, and hifi are generated from. This means I will, again ideally, never have to toy with the XSLT stylesheets after they've been written, because any changes to the rest of the site layout will be handled in AutoSite, not in XSLT along with AutoSite.

Step zero: generating the DocBook

So, obviously, the story has to be in the right format first. I'm used to copying over stuff from an RTF or a Works document into an HTML document, and XML works exactly the same. Elements, tags, attributes, that stuff is all just as much in XML as it is in HTML, with some minor changes to suit XML's idea of being a good interchange format (any XML tool, even if it can't make much sense of an XML document's meaning, can at least read it successfully so long as it's free of typos). You know the weird trailing slashes people insist on including in void elements in HTML?

<img src="bubsy.jpg" alt="what could pawsibly go wrong?" />

That's not an HTML thing, that's an XML thing. XML requires all elements to be closed, even void elements, so void elements act as both an open and a close tag in the same tag. (If you're wondering where the mixup happened, there was an attempt to promote XHTML, which is an XML-based version of HTML, over HTML4 back in the 2000s. This was so feature phones were able to access converted versions of HTML sites in languages more suited for their lack of processing power, like WML. Then phones got more powerful and could just read normal websites and suddenly there was no need, so XHTML, which wasn't very well implemented in browsers anyway, died on the vine. Still, parts of it stick around due to misconception and also nobody but me caring about the difference.)

Anyway, if you're wondering what a DocBook file looks like, here's an abridged snippet of my layout:

<?xml version="1.0" encoding="utf-8"?>
<book xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
    <title>KEVIN AND THEO'S MULTIVERSE MISADVENTURE</title>
    <titleabbrev>Kevin and Theo's Multiverse Misadventure</titleabbrev>
    <info>
        <author><personname>
                <othername>mariteaux</othername>
        </personname></author>
        <bibliomisc role="canonical">http://mariteaux.somnolescent.net/writing/stories/pennyverse/kevin-and-theo/</bibliomisc>
    </info>
    <chapter label="1">
        <info>
            <title>PAGE ONE</title>
            <titleabbrev>Page One</titleabbrev>
            <bibliomisc role="canonical">http://mariteaux.somnolescent.net/writing/stories/pennyverse/kevin-and-theo/01/</bibliomisc>
        </info>
        <para>Musty books. An entire building of them, in fact. An abnormally large aardwolf in a baggy maroon jacket teetered on two legs, carrying a stack of the things from chest to snout. Evening had fallen on the Apricot Bay Public Library, another week had passed, and the void of patrons meant he could round up what books had been discarded around the first floor by impatient children and uncaring teenagers. They called him Kevin.</para>

Not every piece of information will get used on all three versions of the site. I have both an uppercase and a lowercase version of each page name, as nofi uses uppercase on the visible page and lowercase for the page title and lofi and hifi use lowercase everywhere. This will make more sense when you see the XSLT.

DocBook has a lot of elements, a lot of which I don't need and a lot of which people have proposed cutting from the language entirely. I worked through the documentation to convert Kevin and Theo to DocBook throughout the week and got it done this morning. Now for turning it into stuff.

Step one: setting up xsltproc

One method of converting XML into other languages or forms is through a language called XSLT. XSLT is, itself, valid XML, but it also drives XSLT processors that turn XML documents into either HTML or other XML-based languages. XSLT is normally run in a browser on XML documents on a Web server, and this is usually how you'll see it referred to and documented online, but I want to run the conversion step offline for flexibility and also because I'm targeting browsers that have no support for rendering XML themselves, like Netscape.

My XSLT processor of choice is xsltproc, courtesy of the GNOME folks. I run it on Cygwin because it's the most convenient way I have to run Linux terminal stuff with my setup. I made a directory junction so Cygwin stuff could run on files in my sitebuilding folder, and I was ready to roll.

Step two: writing the XSLT stylesheets

This is the part that made me stumble the hardest, partially due to the complete lack of documentation. XSLT is based on templates—through your XSLT stylesheet, you have the processor match chunks of your XML input, and then you tell it what to convert it to. Problem was, I wasn't getting XSLT to match any element. The only thing I could get it to match was /, which meant "the entire DocBook". Funny as it was to see literally everything I wrote get stuffed into the <title> of the page, that's not really what I want.

So here's what wasn't working:

<xsl:template match="chapter/para">
    <p><xsl:apply-templates /></p>
</xsl:template>

Seems innocent enough, right? Match all <para> elements underneath <chapter> elements. Nope! Doesn't work.

After some time bumbling around in the dark, I discovered that XSLT requires you to prefix your namespaces. A namespace is a technical way to tell a program what XML elements are valid in a document. Technically, you can have any element you want in XML—<name>, <victim>, <objectshoveduparse>—but two different XML languages can have the same element name and thus collide with each other, so specifying namespaces and prefixes prevents that collision. I only learned this from StackOverflow, regrettably. (Even more regrettable: this adventure has made me reconsider my rocky long-term history with W3Schools, because it's the only place with decent examples of this stuff in action.)

With prefixes:

<xsl:template match="db:chapter/db:para">
    <p><xsl:apply-templates /></p>
</xsl:template>

That does work.

So began the process of slowly writing templates to convert everything in the DocBook to HTML. Anything that doesn't get used on the page, I have a template that just outputs nothing for that element.

An HTML document generated entirely from DocBook and XSLT

Here's an example of the end result! It might just look like the story on nofi, but it was generated entirely using tools and scripting, not by me playing with the HTML directly.

This is where I left off for the day, though, because I've hit an additional snag: I don't think I can use xsltproc to output multiple separate files. Remember, I don't just want an all-in-one page, I want to have the pages split up and then have an all-in-one option. Seems I'll have to dig into xinclude to set something like this up, which doesn't look too hard, at least, and xsltproc does support it.

Isn't it funny how I do so much technical work to ideally not have to do as much technical work when I want to be artsy instead?


May 04, 2025
The hifi style selector

So that, when you tire of one side, the other serves you best


I've had a bit of a second wind with mari.somnol recently! There was talk on Aftersleep about other people implementing theme switchers on their sites, and it reminded me I put up something similar on hifi and then only gave people two themes to play with. I've now added two more and made a whole ton of improvements to how the style selector works as a whole and how the site loads assets based on the current theme.

As one of those projects I intended to get back to when I had more time (and now I do), let me take you through how the hifi style selector works. I always used to be curious how people implement these on their sites, so if you're not sure yourself, hopefully you can gleam something from my setup. (I'm gonna assume you know a bit about Web pages, how they're put together, and how they're scripted. Mostly, it's just terminology.)

There's three basic components to a theme switcher:

  1. Different stylesheets/assets for each theme, of course
  2. A mechanism to add and remove stylesheets to the page DOM as necessary
  3. A way for the browser to remember the selected theme

Working backwards, the third one is pretty much always going to involve cookies. Cookies always felt to me like a fancy "big site" thing I'd never play with, but they're super straightforward, literally just a line of text stored by the browser with various bits of information inside of it. The cookie for hifi stores the preferred theme, the paths over which the cookie data applies to (so, the whole site), and an expiration date, which I set to be a year past when the cookie is first set.

The second one involves a "frontend" way to select themes and a "backend" way to add and remove them from the DOM, which is just a fancy way of saying the page as seen by programming languages. You can technically use PHP for this, but even as a huge PHP acolyte, I can't really recommend it. PHP is a serverside language, so you'd have to submit an HTML form with the selected theme in the dropdown, parse it on the server, and send back the page with the new theme baked into the markup. I dunno, you don't bring a KitchenAid mixer to a gunfight. If it involves styling the client, you should script the client and use JavaScript for it, even if it is the Devil's Language.

And the first? Here's my setup for that:

The way theme assets are organized on hifi

Each style is given its own folder in my site files with fonts, images, and stylesheets that pertain only to that style. It's almost like a WordPress theme in execution, and it's very clean and self-contained. It's also really easy to make child versions of other themes. I have a dark version of Clean and Tidy, the default hifi theme, which was as simple as @importing in the clean.css in the dark stylesheet and then overwriting a couple of its rules to change the colors and background of the page. Any updates to Clean and Tidy also get applied to the dark version completely automatically.

Making a new theme is actually a lot simpler than I expected it to be. hifi's markup is very theme-agnostic, and the individual page components can be rearranged any which way using CSS grid. The markup is organized so the page collapses into a scrollable tower for phones without the desktop CSS rules, and then above a certain page width, the desktop CSS rules are loaded in using a media query and the layout takes shape. If there's any elements I don't want to appear on certain themes, I mark them with a [theme]_hide class in the markup, and then set that class to display: none; in the theme stylesheet. There is a little bit of duplicating elements on each page, and I could clean that up, but it doesn't seriously impact speed or functionality, so I don't really care to.

styleswitcher.js is where all the magic happens. I've commented up the code, and I guess it's not doing anything too crazy, but in case reading JavaScript makes you break out in hives (me too), I'll give you the rundown in plain English.

  1. readStyleFromCookie() gets called first—if the cookie exists, get the preferred style from it, if not, set the preferred style to the default, Clean and Tidy.
  2. Both of these options pass the preferred style to the setStyle() function, which does the actual heavy lifting of setting up the new stylesheet on the page.
  3. setStyle() starts by nuking all stylesheets from the page DOM. In other words, the page is now completely plain HTML.
  4. setStyle() then adds a new stylesheet to the head of the page by constructing a brand new element and setting it to load the stylesheet at /styles/[preferred style]/[preferred style].css.
  5. I also determine the date one year from now and set a variable to it. This is what we'll put in the cookie for an expiration date. If I don't set it, the cookie only seems to last a few days, which is annoying.
  6. I create/update the cookie. Whatever style is preferred, whether it's the default or an existing preference, is now set as the preference once again.
  7. The style selector dropdown gets set to the value of the preferred style as soon as the page is fully done loading, so that way the name in the box matches the name of the active theme.
  8. One more step! There's a function called loadStyleExtras() that the preferred style gets passed to. This is a big catch-all function for making elements that only exist on certain themes. Nostalgiamining Away (the minerteaux theme) and The Platypus Years (the mari_nc1 theme) load in header images. The Platypus Years also loads in a script of rotating footer lyrics from songs like mari_nc1 had. These would be unnecessary on other themes and add page bloat, so they're loaded in only if you're using that theme. Some themes have no extras at all.

Say the user then sets a new style from the style selector dropdown in the footer of my site. There's an onChange attribute attached to this dropdown that calls readStyleFromSelect(). This reads the value of the dropdown, passes its value to setStyle(), and the process begins from step three anew.

I've said it too many times now, but it bears repeating: this is so fucking satisfying to me. For one thing, it just works well. Modern HTML and CSS have enabled me to completely transmogrify any page into any layout; this kind of thing would simply not be possible on lofi, where the markup is far more closely tethered to the layout and functionality of the page. (And nofi doesn't use CSS at all! Or have much of a layout to change!) Beyond that, each theme is based on an older site I've had, and at any moment, I can just look at my modern, 2025 work and art and album reviews in any old random Cammy site layout, like the most bonkers kind of alternate reality time travel. My favorite at the moment has to be the minerteaux theme—for a site that was literally only up for a week at the time, I'm strangely attached to it. Must be those XFader textures. Pleasing to use and to look at.

I always thought that hifi and returning to mariteaux.somnolescent.net would come with a feeling of my identity online being solidified again, and it really has. I've just been feeling a lot more confident in myself and how I look to the world lately. It's lovely.

If you're curious about further themes—I think I've run out of Cammy sites to turn into themes, really. mari_v1 is now a theme. mari_v2 became lofi, so it doesn't really need to also be a theme on hifi. mari_v3 is the default hifi theme in light and dark variants. mari_nc1 is a theme now. mari_nc2 is a little too basic to turn into a theme. minerteaux is a theme now. I could do some meme layouts based on other Somnolians' sites, but those would date potentially with redesigns. I was thinking of doing a Bootstrap version of hifi a la dcb_bootstrap, but when I started adding Bootstrap grid classes to the markup, it started breaking the other themes, so that's a no, sadly.

I'm happy with this, honestly! If there do come more opportunities for theme fun, it's dead simple to make new ones and add them, but for now, the current set pleases me greatly. The final frontier of hifi work is honestly just to get my stories on there again. I've finally been poking at DocBook and XSLT, and as overwhelming as it is at first blush, I think it'll be everything I need to keep six (!) different versions of each story in harmony. That'll be a journal post for a day when I have that figured out, though.


May 02, 2025
Felix sketches!

Only took me 10+ years


If you've known me for a very long time, we're talking the teen years, and even then, you had to be close to me—okay, so basically, only Savannah knows, but still—I've actually had OC ideas and ambitions since I was 14, but a lack of drawing ability really kept me from sharing them widely. I tried to write them, but nobody reads that shit and it wasn't very good anyway. Even since I learned to draw, there's been a certain fear I've had of actually designing them for whatever reason. 2025 marks ten years of a lot of them existing with literally zero trace of them outside of private chats and the isolation of my mind.

This boy was the very first one! His name is Felix. I got into Pokémon and Mystery Dungeon early in 2014 as a way to pass the time stuck at home expelled from school, and I got obsessed. Oshawotts just became my favorite thing ever especially and are probably the reason I like mustelids so much these days. I was super creative, so originally, Felix was named Maru (y'know, Oshawott's Japanese name?), but somewhere down the line, he became Felix to me. He's soppy and easily frightened, often convinced he's cursed thanks to his shiny coloration, but unendingly loyal and will push through the pain when he knows he has to. He also loves sweets and seafood. He lives with his lifelong Chespin friend/sorta girlfriend Hazel, his headstrong, adventurous, protective other half (while Felix acts as her common sense and conscience).

Felix does have a more realistic anthro otter design I'll be designing for Pinède as well (and Caby encouraged me to come up with a species and Pinède design for Hazel as well, which is a great idea). This was just a sheet to figure out how I like to draw him, since I've never really done so before now. Shame, really—I've decided to start really cranking out toyhou.se bios, refs, and doodle sheets of all my neglected characters (which is basically all of them) to make up for it. They'd forgive me and appreciate the attention, I hope. I know I'm happy to see him.


Few more random thoughts while I've got the journal pulled up. Some more discussion with the Somnolians about me getting fired has led me to settle on the idea that it was probably financial, if they were replacing me with part time help that wasn't owed benefits or anything. Still majorly shitty, but whatever, less to do with me than I initially thought. If you're curious, the beer store was already tightly staffed—it was just the four of us, and that includes two store managers. I was the least senior of anyone there, so I guess it makes sense. Still shitty, but I've made peace with it.

Finally, if you cast your eyes back over to hifi, check the theme switcher! I cranked out a theme based on minerteaux earlier today in literally two hours, which is a far shorter turnaround for building a site theme than I anticipated. If you don't remember (lots of memberberries today), minerteaux was a literal week-long redesign I did of my Neocities site back in November 2018 to get back at the idea (thanks to my essay on nostalgiamining) that I just happened to hate old-looking websites. It was actually a pretty fun larp to go on, and I'm still fond of how it came out, so a theme it becomes! (You can read this slightly later essay on the project if you're wondering how I put it together. The modern version uses grid and CSS and just looks like a table layout.) That just leaves mari_v1 on the table for needing a theme...

Later though. I'm gonna keep working on the Guitar Hero II RetroAchievements set. Five-star Expert bass grind is hugely satisfying.


April 30, 2025
Insincere

You couldn't do it in person, you had to text message break up


Well, I am again unemployed. This is the first time I've ever actually gotten fired from a job instead of leaving. If you're asking "well, what did you do?", so am I. I got broken up with over a thirty-second phone call that just said "we're making some changes and your services are no longer needed" at noon on my day off. That was it. Wasn't like "hey, was good working with you", no explanation for why, just "Okay? Alright, bye." And no, there were no writeups, no paper trail for any incidents. This just isn't how you fire someone, but that's how it was done.

My first reaction was one of anger, honestly, at how bitchmade a fucking firing over phone call really is. I stayed positive about it for the rest of the evening and through last night's stream, thinking how that job made me a bunch of savings and paid off my student loans and how now I have so much more time per week to catch up on creative stuff, but something sad hit me last night instead, and that's kinda been the feeling ever since. I'm just sorta left to wonder what it was that was sealed the deal—and it really could've been as simple as the trust fund kids who own the company don't like me. Everything I can think of that they might claim was firable, someone else there was openly doing and saying as well, and usually multiple people. Maybe that's like how it's always been though, where marf bad even though everyone else is also doing the same thing.

See, what's funny is that they said they were hiring for "part-time help with the summer coming up" in the days leading up to my firing, and they've been training a new guy over the past week. They would've just gotten done showing him how to tear down trucks yesterday when I got the call, and that was the end of his training to my knowledge. It's not out of the question that was actually my replacement, and if that's the case, that's some hardcore bitch shit. Nothing was amiss. No goodbye for the night was out of the ordinary. I just left on Sunday, hung out on Monday, got the call Tuesday. She waited until I was far enough away to say "see ya, wouldn't wanna be ya" and then ducked the fuck out in under a minute.

I wonder if I'll still be able to peek at people's schedules through the app for a bit—if he gets promoted to full-time, I suppose I'll have my answer.

Yeah, I think that's the gayest part. I specifically asked during the interview back in August of last year if I was actually going to get told if something was a problem, and I got emphatically told yes, and the answer turned out to actually be no. This is why, for all the bad shit at Staples, I felt connected to my GM, an honest dude who understood me, explained a lot of shit to me, and told me to get out of the way before it was too late. I have gotten infinitely more honest answers from my first grocery store job where I was making $11 an hour as the asshole beer counter guy than I did from the cowardly fucking store manager here, two years in and infinitely better at the work and the social skills.

Fuck 'em.

For me going forward, the plan is pretty simple. I'm not gonna look for work ahead of the trip, because that would be stupid. I have the savings, I can just hang out at home for a couple months and work on art and marfGH stuff like I've really wanted to anyway. Then I'll do the trip, stay probably a month and a half (I'll ask Caby what's the longest she'll tolerate me, not like staying longer costs more), and find something when I get back home. I think I can finally start chipping away at my various music and reading backlogs and getting ahead on the things I've been wanting to do without standing around, waiting for HVAC workers with missing teeth to sell cases of Busch Light to. You enjoy your flagging store because your owners are too concerned with bringing in craft NA beer no one drinks and spending thousands trying to win glorified AB display lotteries for the princely sum of about half of what currently sits in my bank account as a peasant. Eat shit.

(Sidenote, I saw a post on Tumblr a few weeks ago where someone was bizarrely confused at the idea of a gaming/etc backlog? Like no, most people's backlogs are not like a business trying to hit quarterly earning goals—you just have a lot you wanna play and finite time to get to it all. It getting turned into a neat list only makes sense. I imagine backlogs probably don't make sense to people who only play three games, but y'know, whatever. Just a stray thought.)

I'll try to get this journal moving more as a result of all the extra free time. Buckle in. It's nice out.

I might sound insincere 'cause I'm
Wasted all the time, I've
Thought it over and

It's over

I'd like to thank you, my dear
In less than a year

It's over


April 20, 2025
Happy Easter!

Bunbon bunbon bunbon


Well, what is this? A drawing from your old pal Cammy? Yeah, turns out Warring with my Mental Health doesn't stop me from drawing a fucking picture, because I don't suck dick on the weekends, so instead I lined this sketch of Bunny and afan from last year and shaded and colored it all sunny, because happy Easter, you fucks! Good times.

Completely unrelated story: sometimes it takes a dragon spitting in your mouth (while fruitily whispering into your snoot how much you like it) for you to realize how precious life is. I had this really hot Carolina Reaper jerky from Mythical Meats, the jerky we sell at the beer store I work at, on Friday, and my stupid ass, told plenty of how this jerky was A Little Excessive, kept popping piece after piece of just the 2oz bag of it, waiting for the truly mythical heat to kick in until I finished the whole bag. In the mouth? A little nose running, need a drink. In the stomach? I was still doubled over at 2AM, and you bet I hibernated for 12 hours and had to go super Saiyan the next day.

Don't fuck with the Carolina Reaper. That shit will sue you in Australian court for $300,000, and it will win.

Anyway! It was good jerky, and people IRL speculated it was the cause of my absurd energy on Saturday. In reality, I think I'm just tired of being down bad, and I think I'm ready to start embracing how I work and the good things I have to offer the world. It's just the fact of the matter—I work fast, I do everything, I'm here to get my ideas out and not to be gifted in any one medium. I want to celebrate that more. This is the first time in history I've really been able to appreciate my specific, well-rounded gifts, and somehow it's all flown under my radar until now because I'm a sperg who has perpetual tunnel vision.

I visited some comic shops on Monday with Logan, who came down for a visit. Got myself some PS1, PS2, and Wii games, plus an unplayably battered vinyl copy of The Doors' self-titled and a much better condition copy of Cream's Disraeli Gears. Both are very good, the former I thankfully only spent $4 for the privilege for, and the latter $10. I liked 'em both quite a bit. I'll have to replace the Doors one sometime soon. Keep an eye on the album reviews for more random record store pickups I've been listening through at random soon.


April 06, 2025
hifi is real 2401

Capping off a two year long saga the best way


hifi finally went live two days ago. I've honestly been looking at it all day, on every single computer, phone, and device I can get in my hands. I'm not just thrilled, I'm satisfied. There's still lots to be done, but I've reclaimed a huge part of the way I present myself to the world, one that's been a two year plus process.

I'm still pretty beat from another forty hour work week, and I've been misspelling every word I type here, so I'll keep this brief. (Update from post-writing: I did not really keep it brief.)

I don't have an exact date, but by the time 2023 started, I was pretty well dissatisfied with mari.somnol. I was split between identities, what I thought I could share with the world as mariteaux (my music and modding stuff) and all the furry art and writing stuff I was really into that I felt I could only do as someone else. It kinda sucked. Initially, I used mari.somnol for the former and cammy.somnol for the latter, but it felt like having two halves of me split across different domains. That just wasn't gonna do.

In June, I parked mari.somnol proper and started from scratch over on Macintosh Garden's Web hosting. I laid out everything you see on my sites now, a proper clearinghouse of everything I made and wanted to show the world. Art, music, reviews, essays, you name it. I started unearthing stuff that I'd done on the Scratchpad or the group blog that had gotten buried in time and finally gave it a place on my site.

It was great, and I was really happy with it, but it wasn't on Somnolescent. It was never meant to be permanent. It just sucked having to link people to this place that wasn't the somnolescent.net domain I've been coveting since I was 14.

Come mid-2024, I developed the nofi/lofi/hifi idea and started planning ways to maintain three different websites feasible. My time with Protoweb introduced me to how much I love writing PHP, and nofi launched in May 2024. lofi launched shortly thereafter.

They were great, and I was really happy with them, but they still weren't mari.somnol. This whole thing was to rebuild mari.somnol, my place on the Web, the place I've posted everything to since December 2018. hifi was the final step, but it was going to be the most complex of the three, and life and jobs and other projects meant putting it off. It just sucked having to link people to something that wasn't mari.somnol.

In February, I said "fuck it, I'm tired of waiting", and went for it. I started work with a few pages, and then the layout switcher. Even when it was working, I still had to tweak the pages and how I was building them to accommodate multiple layouts. There's potentially still a lot more work on that front when I unveil the minerteaux and mari_v1 themes. I didn't care. Finished over perfect. It would go up soon.

I drew a really adorable marf and Cammy, lined it, made it wobble like the Alexis and Setters on nofi and lofi, and it was ready to go. hifi went up on April 4, 2025.

The return to mari.somnol, after years of having it parked with that same wonky early lofi layout, is here. It's responsive. It hits all the checkboxes. That Cammy and marf may be my favorite thing I've ever drawn, period. It's not just satisfying for how it came out, it's satisfying for finally having reclaimed my subdomain, a place that was quietly unused for literal years despite being the one with my name on it. I can go home now. I can bring people to my home now, and show them the cool things I'm up to. Yes, I am sentimental about this.

There is still work to be done, but I don't care. It's so rare for me to finish things anymore that, when I do, I look at them more than anybody. I think it's a good sign when you can make something that you personally enjoy. I like my old music more than anybody else. I read my album reviews more than anybody else. I don't think it's narcissism, I think it's making something so good, your target audience goes nuts for it—and as a hobbyist, your target audience should be you.

I'm damn proud of what I do.

I think I'm coming back up, after a really shitty month last month. Not periods of mania, but learning to be self-sufficient again. Everyone else is weird and they have their own things going on. Only I can always make myself happy. That's a whole journal entry in of itself, but it's a lesson I've needed to learn for well over a decade now, and I think I'm finally getting it.


March 29, 2025
And now I guess it was a bad sign

Least I have a lot to show for it?


Journal! Why have I forsaken you. I don't particularly want to dump a load of really personal shit out onto the Internet, but I have been going through one of the most unstable mental health episodes I've ever experienced. My mood has been a fucking yo-yo. For extra hilarity, I also decided to start a strict diet and temporarily quit drinking to gain some mental clarity, and while I ultimately think those were a good call, short term, I am down two things that I quite enjoyed in a period of already not feeling great. I have the timing of a drummer.

That out of the way, I have been fairly busy with some legitimately cool things, so let me quickly get March summed up on here as I look forward to a much more stable April...

The marfGH repo

marfGH continues to be sharp in my mind's eye. I have a handful more songs to finish for Volume 1, I want all the menus to get retextured (and the lads are interested in helping, bless them, and I'm interested in paying them for it, yes), and I've been working on a few new script features to really separate marfGH from the rest of the pack. Some of these (Jukebox Mode, manual camera cut authoring) have long been implemented and I've just been cleaning up how I wrote them, and some (like a make a setlist mode to play any number of songs without having to menu dive each time) are taking experimentation and knowledge to put together right now.

As such, I have started a GitHub repo for my chart testing disc. These feature all of my working scripts in DTA (plain text) format, no songs or milos included. I know the audience for this is fairly limited to only the handful of people in the community that can read, build DTAs into the tokenized format the game actually uses, and debug any issues, but it makes me happy to see. This also gives me version control in case I ever really fuck the dog in the ass and end up with a nonfunctioning disc somehow.

One other big script project: cleanup of the entire game's internals. marfGH uses very few of GH2's menus or features—no Career, no memory card functionality, no splash screens, etc. I've been working a lot on stripping out unused features as they pertain to my disc, mostly so I don't have to work around a lot of vestigial scripting should I want to write more features into the game. With milos, I've dropped 10MB of disc space and removed a couple UI scripts entirely from the equation, so I'm very happy with the weight reduction.

A new plan for sketches

I kinda lost steam on art at the start of the year. Caby has a saying that, if you find yourself creatively frustrated, that often means a breakthrough is coming on, and I think I've had one lately. I've been very exacting and careful with my sketches in the past. This made sense in 2022 when I was just trying to make a cat look like a cat, but I'm now three years in, and all the tons of layers and going slow has done is, well, slow me down. I know roughly how to draw a humanoid body, I don't need to be so scared of it.

I've been retraining my hand and brain to draw lighter and quicker as a result. This lets me sketch on one layer (and hopefully eventually paper) without having things become an unreadable mess, and I've been trying to rely more on simple shapes to block things out than worry about complex detailing in the sketch stage. I think it's already paying off nicely. Here's a handful of sketches I've done in the past two weeks:

A load of OC sketches from over the course of March

Two of these are Caby and Savannah's superkitty OCs (superkitties being an open species of sorts I made to group Miranda and Prince as the thickly-maned anthro cats they are), one is my girl Miranda taking a look in a book, and then there's a Cammy holding a marf that I sketched out for the home page of hifi that I will hopefully line and be able to get the site out soon. Also, there's some Sebs. I drew those before I started experimenting with pen pressure, mostly to remember how to draw him because he was on my mind a lot. I'll get back to that.

I really like all of these! Drawing is a lot of fun when I let myself have fun with it. Caby also suggested I do more aimless doodling and not worry so much if I can use things for specific purposes (game graphics, site graphics, toyhou.se profiles, etc), and that's been a big relief too. Caby is always right.

And here we are, nowhere

I've also been dancing with writing stories again. Another thing I lost steam on going into 2025 was my character work. That's a whole other story that, again, I really don't want to dump online, but it sucked. I've been missing my good lads, and I realized how many stories I want to write that I haven't yet.

So things started with Seb, as they once did. I've been wondering about his past, and since Pennyverse proper is still a bit fragile (a lot less now that I've been writing), I thought I'd start with his college years. It'd give me a chance to revisit him, now that I see him as this socially fearful, timid shut-in as opposed to the big angy armadillo he used to be, and pour some of my own college experiences into him in the process. I wrote some brief snippets of story and a fake IRC log of him logging into a school chatroom and making a friend, funnily enough a Japanese badger. (I've yet to visually design him, but his name's Kirin, I think.) That got me thinking about his arc over those four years and how he has his first run-in with Pennyverse's true, unsung antagonist, the settlement guardian for The City (rename pending).

I was feeling encouraged, so I pocketed all those for the moment and switched back to a story I'd started writing a while back but didn't get very far into, Nowhere. Nowhere was meant to be a Pokémon Mystery Dungeon fic and tribute to me as a teenager, back when I wanted to draw and make OCs and was too scared of being shit at any of it to. Nowhere is about this human girl who panics her way into the Pokémon world and wakes up a Cyndaquil, and she has to travel far north with an especially stupid Wooper named Gilbert to learn the way back to the real world. Each chapter is themed after a specific song on the Ride album Nowhere, which I definitely used to listen to back when I was 15 and would idly fantasize about PMD OCs on car rides. (I feel a link between the worlds of shoegaze and PMD that no one but me does, but Caby says it works, so that makes me happy.)

I've only gotten two chapters and change into it, but I'm doing my best to get going again. I feel like, especially if I pinned some illustrations to it, I could have something that other folks online would like as well, not just in the story but in the fact that it's weirdly a PMD fic that's not very tied to the games. Normally, PMD starts with you turned into a Pokémon, and you and a partner starting a rescue team and going out and, well, rescuing, but I've got very little of that going on. Miki (the Cyndaquil) and Gilbert will end up in dungeons, sure, but they're not multi-floor affairs with Skarmory at the top, they're just story bits that play out in caves and in woods.

It's been nice to reconceptualize a lot of my old OCs as well. Just about everyone important in this story has been a character I've had in mind since I was 14-15, and it's been nice finally giving them a home because I couldn't do it back then. Hopefully, it won't be forever before you guys see anything of it.

A reading rainbow

hifi mari.somnol is perpetually ten minutes away from launching. I just need to line that Cammy and marf, basically, before I feel comfortable launching it proper. It won't be feature-complete, but it will be complete enough that I can start showing it off and updating a whole ton of links that currently go to lofi.

One of the things that won't be present at launch are my stories, for one thing because I have very few that I'm happy with sharing super publicly at the moment. I did put Kevin and Theo's Multiverse Misadventure up on nofi, but transferring that to HTML only made me realize what a fucking nightmare maintaining three copies of every single story will eventually become at scale. I started planning out a PHP/MySQL-based solution for delivering stories (which I wrote about in my last journal entry and then completely forgot about), but that felt like a lot of work, and there'd need to be quite a lot of finding and replacing to deliver HTML 3.2 <font> stuff to nofi, less semantic HTML 4 and CSS to lofi, and normal semantic HTML5 and CSS to hifi.

So, I went looking for markup languages that can produce books instead. There's plenty out there—LaTeX, AsciiDoc, FictionBook, and the one I've started looking at, DocBook. My goal is to have each story as a document that can be rendered out to the three sites with zero extra work needed on my part. If I need to fix something, I fix it in one place, rerender, and reupload.

DocBook seems to meet my needs quite comfortably. It's XML-based (which means it's written nearly identically to HTML) and can be converted to HTML through a language called XSLT. XSLT, in simplest terms, controls how a program turns an XML document into another format. This sets which elements turn into other elements, how certain patterns of elements should be handled, all that kinda logic-y stuff that normally I would do by hand in my head. DocBook is meant for technical references, but nothing really stops it from being used for stories. It can do pages, books, chapters, articles, paragraphs, quotes, and again, with three different XSLT files, I can turn one DocBook XML file into three sets of HTML pages for nofi, lofi, and hifi—no database required.

I will keep everyone updated on how learning DocBook goes when it comes time to start putting stories up on the site. I doubt it'll be very complicated.

Somnolescent streamer house

On a very brain off head empty note, everyone's been streaming every week! Me on my channel on Tuesdays, and Caby and Savannah over on Twitch on Sundays and Fridays, respectively. It's been a lot of fun watching folks get through games and revisit old favorites, and on my end, it keeps me playing games, which I've been known to neglect in the past. At the moment, I'm maybe halfway through Ratchet and Clank: Going Commando (I played the first one on stream last year), and I'll be onto Jak and Daxter: The Precursor Legacy when it gets warmer out and we're all in the mood for something lush and light.

Catch our streams! Seriously, they're a lot of fun, and we will chat with you. Provided you're not a total loon. Please don't be a total loon.

Anyway, I'll keep up with the journal stuff better, promise. I think things are stabilizing, and writing in this thing definitely keeps me a little more grounded, like having to consciously commit things I've done to long-term memory as opposed to them being immediately forgotten the moment they get posted to Discord, as I am known to do. See you around, lads.


March 05, 2025
Story synchronization

Doing more work to benefit me in doing more work


I have had this unexplainable sense of impending doom over the past week or so. It always gets disproven, I know these thoughts are usually pretty silly, and I've experienced enough emotional upset in my life to learn to ignore it pretty well. Still, vividly imagining my getting terminated at work or spending this morning pondering how all my backups would be completely fucked in the case of a house fire, of course. (Tossing out all my working creative methods to try and make it easier on myself in the future has had the exact opposite effect in the short term, also.) I swear I've been having much weirder dreams than usual lately, but damn if I can remember them now.

So while I ease those thoughts by working a little harder on the clock and looking into a BackBlaze subscription, let's dust the journal off with some Web talk like I do best.

I intended to have hifi finished by the end of last month, but aside from my lack of desire to work on it, I have hit a certain road block in site structuring that requires some planning and PHP. Keeping three sites in sync is not easy, doubly so for sections with a ton of static pages, like my Guitar Hero modding tutorials or my stories. Each version across nofi/lofi/hifi has roughly the same page content, but differences in markup and image handling that make them kinda completely nightmarish. nofi uses no CSS at all; lofi uses no HTML5, and thus much fewer semantic elements. hifi alone uses <figure> and <figcaption> for styling images and their associated captions. All three use similarly-named images in different file formats.

The worst part? Each page, multiply it by three. If I have 19 tutorials on my site, I'm actually maintaining 57 pages on the backend. This is not realistic on myself.

My stories present an extra challenge, page length. My old stories on mari_v2 were short enough that they could go on a single HTML page each, but if I ever write anything longer (which is a definite possibility in the future), page weight and ease of reading become a concern. I'm catering to Windows 95 computers with 64MB of RAM running Netscape 3.0 alongside your phone or gaming desktop. With one longer story, I can easily make that machine eat shit, or split up to make it happy, annoy people on modern machines who want an uninterrupted reading experience. Or, perhaps, people do want things split into smaller chunks! Does that mean they'll be forced into using nofi with none of the creature comforts of lofi and hifi having actual layouts and page widths and shit?

Here's my proposal. I'm writing this for my own use as much as your enjoyment--explaining the solution is the first step towards implementing it. (I get none of this is particularly fancy and I'm potentially overexplaining things, but I'm also writing for friends and people who don't work with databases. Not everyone can be as smart as you, Greg.)

I've already been making good use of PHP and MySQL stuff for my album reviews, and I think they're the answer here as well. If you don't know, a SQL database isn't just potentially one chunk of data. They can have any number of database tables in them. Databases contain tables, tables contain rows, rows contain as many individual cells as needed, and all of these are easily identifiable and are a really excellent way for organizing big slabs of data.

The plan is to have a database where each "bundle" of reading material, whether that be a tutorial section, a story, or a collection of stories, is its own table, and each row is an individual (HTML) page and associated metadata, like page descriptions or if each row belongs to a larger chapter. I can then use PHP to get rows and tables on demand and manipulate and format them as desired, using find and replace to save me having to maintain each version of each page separately, or joining rows together to have a story on one, unbroken page.

Obviously, for larger stories, the appeal is obvious. I write the markup once, and PHP can, all on command, return the whole story on a single page or return the nofi version with CSS classes for character dialogue color coding replaced with <font> tag soup all without me needing to do anything. PHP offers some really nice find and replace functionality, like accepting arrays for both the find and replace in an operation. I just have a list of what to replace with what for each site version, and it brings it to your browser without me touching anything.

For smaller collections of stories, each row can be its own stort. With what I've currently been writing with Pennyverse, that can be a prose snippet, a chatlog, a typed up fake news article, or frankly any way you can tell a story in a chunk of markup, like individual pictures for a comic. Point being, all of these tiny stories are nicely organized together, but can be returned separately. Tutorials work the same way: all tutorials are collected in one place, and I only have to write them once and do the find and replace for each mari.somnol version.

As a nice bonus, .htaccess trickery lets me do this completely invisibly in the background by rewriting the actual, messy links to the PHP script that does all the heavy lifting with HTTP GET variables and the like into nice, clean, static-looking URLs. Something like stories.php?story=kevin-and-theo&page=2 becomes stories/pennyverse/kevin-and-theo/2/ and back as well. .htaccess silently redirects a request for the latter to the former, the script looks up the correct row in the correct table, returns the text, formats the page, and delivers it to you at the latter URL without you ever seeing the redirects. Pretty neat, huh?

I'm going to soft launch hifi without any of this having been done hopefully within the next week. I can't do any database work on my home server copy because DreamHost obviously doesn't accept offsite database requests. I'm sure WampServer packs some kinda MySQL solution into it that I can use (hence the M in "Wamp"), but I never set anything like that up and frankly, I'm okay with just deferring it. It's better to have it online over perfect, and it's better to let people enjoy what I've done so far than make them wait even another week for me to implement another feature, even if it is a very cool one. I really have to start downsizing and chunking my projects more, so I think a soft and incomplete launch is just what the doctor ordered.

That, and a full Somnol Discord server backup just in case something happens. Did I mention I've got a weird sense of dread lately?


February 12, 2025
Six months at the beer store!

We're getting somewhere with all of this


Happy belated six months of me working at my current job! This puts it in second place for longest jobs held, ahead of Staples and certainly ahead of Giant.

It's been pretty good! Working at a beer distributor definitely beats working alcohol sales at grocery stores—lower volume of traffic, actual benefits, no purchase restrictions (I could sell you a whole 192oz back when I worked the grocery stores!), no assholes not buying booze who treat me as a human fast lane instead of the designated beer counter, and there's a lot less bureaucracy because it's a small, local business and not a chain headquartered in another state. I have met everyone from the owner to everyone on the sales team to the warehouse guys putting together all the pallets for the rest of the area we service.

I'm making almost double what I did doing basically the same work at the grocery stores, it just feels slower because I only get paid every other week instead of every week. That money has piled up, though. Being as frugal as I am (even when I do get spendy, like over Christmas, I still came out in the black for the month), I have the better part of $10,000 saved up, which is my current car budget. I don't intend to pay that much, I just want to cast the net as wide as possible when we do start looking for a decent ride, which I guess should be soon. That's after having used this job to pay off both of the student loans in my name (to the tune of almost $5,000 each) and almost the one in my mom's name ($400 left on that, which would be gone today if she didn't get really touchy about me blowing through my savings to kill off loans).

Better yet—it's tax season here, and my tax guy has over $1300 on the way for me, effectively 12-13 days of extra pay the government owes me back. That puts me around $7,000 sitting around right now. Pretty sure this is the most I've ever had saved up at once.

I'm finally almost financially prepared for the next phase of my life. At a base level, not having to worry about how I'm getting to and from work is a boon, but then you get into the freedom to run errands, sell off extraneous games and junk lying around, go and do things in the community, visit record stores and arcades and friends, visiting friends! Yearly Somnol crossover episodes! Caby will be able to visit me if I can get her and I places!

Admittedly, all of this hard work in setting up the last chunk of my life in the US comes with the fact that, well, it's hard work. I definitely don't have the free time and energy that I used to, even at the grocery stores. Just that extra ten hours a week, plus our store's pretty reasonable hours of late morning to early evening every day, makes every day worked feel pretty much like an all-day affair (and Saturdays really are, open to close, nine-and-a-half hours). I'm still working retail, albeit specialized retail. It's still customer service, and selling a lot of cases of cheap beer to husky backwoods trucker dudes and construction workers. It has led to moments where I feel a lot more absent from my hobbies with games and music, my creative work, Somnol, and Caby than I want to be (not to mention my alarming regularity for falling asleep without saying goodnight to anyone). My memory, I'm pretty sure has gotten worse since I started working here—it's not dementia, it's just a lack of energy and more often missing things.

I definitely have grander ambitions in life than working restocking and cashier work for a store, even one as decent as this (I'd hope so, hard to get a work visa on retail associate experience). I do fantasize about the final day I work here, but it's really not due to anything bad about the job itself—I get along pretty well with everyone here, even though they're all personalities in their own right, and it's so slow often enough, I've been able to get a lot of writing work done while on my shifts (like this journal entry!), which helps me to feel productive even when I just want to relax at nights. It's just that idea of having the car, having the certs, this job having finally paid off the last of the financial damage college did to me six whole years ago now, even if it's just going from nice retail to entry-level helpdesk tech work or whatever, and finally being able to focus on what I really want, to focus on getting into Wales and starting my life where I should be. That's intoxicating.

But I am super glad to have this job, and I'm happy to be here as long as they have me. I know how much worse it can be out there, and savings are pog. Other than the long hours, this ain't too shabby. And hey! Easy access to a pretty decent selection of beer. I've got plenty waiting at home, a lot of it I got for free. Can't beat that.

By the way, I believe we have a lock on the next Wales trip. More details to come, but Caby and Cammy may be getting their first taste of proper domesticore. That wakes a Cammy up any day.


February 02, 2025
hifi in progress

Cammy has a cooler site than you


Y'know, it still feels incredibly weird to refer to myself as having mental health issues. I think it comes from years of having enemies trying to fuck with me and me going "well, I'm not about to give you the satisfaction of watching me suffah". In all truth, mine are not so bad I can't get up and go to work and have hobbies and friends, but sometimes we careen between the rabbit and the hare ends of the spectrum, to use a niche reference.

Fuck all that though. hifi is being built!

hifi is the final boss, the final frontier of mari.somnol. This is the full fat, responsive, totally modern version of the site with bells and whistles that wouldn't be remotely possible on nofi or lofi. It's gonna have everything. It's gonna look nice on all your devices. It's gonna have themes, so you can pick your favorite retro Cammy site layout and it'll remember it, and you can pretend it's still 2018/2019/2020, or perhaps a far-flung future where Cammy built a site on Bootstrap.

The v3 theme on hifi The nc1 theme on hifi

And although it's only partially implemented at the moment, this is all working right now.

This current push has been motivated by, of course, marfGH, and the realization that I'm not too comfortable directing people to download an ISO on a half-finished site. Although I'm still super happy with lofi and I don't mind people seeing it, it's not mari.somnol. It's lofi.mari.somnol. It's a little less accessible, a little less user-friendly, and when I've already had issues keeping my discs accessible to the public, I want to put as little as possible between them and my work. Although I had an .htaccess redirect to lofi going on the main subdomain, I disabled it because it wasn't working right and I was too lazy to fix it (but not too lazy to build an entire site, yes).

This is the first time since before the Retablening in 2020 that I've had an eye towards building a mobile-friendly responsive site, and it's been a lot of fun and quite refreshing. It sounds like a lot of work at first, that you'd need to build two layouts, but you actually only need to build the one layout—your HTML without any CSS is already a mobile-friendly tower, so you simply sweeten that a little and load all your desktop declarations through a media query on top of it. In my case, I'm using a mixture of grid for the structure and flex for anything that I need to reflow from row to column on mobile, like navbars. This has meant what I normally use tables for, like grids of thumbnails, I simply set as flex containers and let the browser figure out the organization of based on the available space.

This is also what makes the theme switcher possible. The HTML is very agnostic on layout, and with very little extra bloat or duplication of elements, I can recolor and rearrange the page into any number of configurations by simply loading in a different stylesheet. As of writing this, I have two themes implemented, the mari_v3 theme and the mari_nc1 theme, which I affectionately refer to as the "platypus" theme. Already, I find these unbelievably trippy to play with. They're not using the literal styling of the old site designs, they're much cleaner recreations to match my functionality goals for hifi, but the assets, the overall layouts, the colors, they're straight from the originals. It's this bizarre mix of my modern site content, my new art and maps and music, with the look of my first ever Neocities site—it's bonkers and I think I love it.

Admittedly, this is not perfectly put together right now. I still need to implement the cookie store and check to remember which theme you prefer and set it on page load, and at the moment, I'm loading in image assets for all themes regardless of which theme you're using. That one, I think I can fix just by loading certain assets through JavaScript instead—which normally I am completely against because it unnecessarily makes your site reliant on the Devil's Language, but the theme switcher only works if you have JavaScript on anyway, and the site is fully functional with it disabled (since the mari_v3 theme is a fully functional theme on its own, obviously), so I'm perfectly okay with extra code to ease the overall load of the site for those opting into using it.

There's still a lot of work to go on the content end of things as well, implementing the other themes (I think I'll defer a few until post-launch) and porting over the rest of the pages from lofi, which isn't hard, just tedious. I'd like to build a minerteaux and dark v3 theme to complement the existing two, and after launch, I'll figure out reimplementing mari_v1 and a goofy meme Bootstrap theme a la dcb_bootstrap. That covers all the old site designs and ideas I had in mind—v2 was the basis for lofi, so count that in the mix even if it's not in the theme switcher.

Really, I'm just stoked to have finally done it. The website to end all websites. Barring HTTPS nonsense that I washed my hands of in January, I have finally made a universal website, and not just one that pusses out and is super mumblecore and simplistic and goes "that's a motherfucking website"—I mean it looks and works nicely everywhere. It's the playground for everything I've made so far and everything I will make going forwards. I parked mari.somnol back in 2023, and here we are in 2025, finally fully settled back into my true place on the Web, able to use any layout and any browser I want to look at my shit. Absolutely bananas.


No page to go back to! Page 1 of 2

Previous months