Lia's BK nonsense

Baten Kaitos Let's Play tweets archive

Starting at the end of 2020 and all the way into the start of 2023, I made my way through both Baten Kaitos games on emulator and made obnoxiously long Twitter threads about the entire process. The final format ended up being something ressembling a text-based Let's Play.

Below are links to a HTML-only version of those Twitter threads, as the service has been collapsing and threads became locked behind login. There are also links to all the original Twitter threads for posterity, while that still works.

Static archive

These archives aim at mimicking the experience of reading the completed Twitter threads but, y'know, on a website that works and with minimal bloat. They do not however include replies from other users or other interactions. There is a blurb below with the technical details of how I built the thing, if you're curious.

Every screenshot comes with the alt-text it was originally tweeted with. Generally that is all text that was on-screen, or a coarse description of the scene. I strove to use content warnings for the most egregious bits, but they are not necessarily extensive or sufficient for everyone! For example, because this a somewhat typical JRPG, solving problems through violence is constant and did not get tagged.

Original typos, grammar mistakes, accidental missed things and such have been left in. Do not contact me about those. I know, they hurt to look at, but if I start fixing things then I have to decide how deep the editing actually needs to go, and that's hard.

Tweets, profile pictures and usernames from other people are added with their consent. For now that is a couple quoted tweets. Consent will be re-requested for any addition (see Future Work) and can be withdrawn at any time. Just contact me via the info at the bottom of the page.

Eternal Wings playthrough

This was a replay that took place from 2020-10-14 to 2020-12-24, aiming for 100% completion. The entire thing comes with major spoiler warnings from the very start, for all of Eternal Wings and The Big Plot Twist in particular: analyzing how said plot twist is and isn't signposted was a major part of the fun. Also contains strong opinions by a queer antifascist but if that bothers you I don't want you reading my stuff anyway.

Baten Kaitos: Eternal Wings and the Lost Ocean tweets archive

Origins playthrough

This was a first playthrough that took place from 2021-04-15 to 2023-02-11. While I wasn't initially aiming for 100% completion and did not quite get there, I ended up chasing sidequests and every last textbox, which is part of why it took me the best part of two years - other reasons are Control, Outer Wilds, Returnal, and life getting in the way. There are no spoilers since I was discovering the game for the first time.

Baten Kaitos: Origins tweets archive

Eternal Wings playthrough

Here are the links to the original Twitter threads for the Eternal Wings playthrough. Some of the tweets can be marked as unnavailable for no apparent reason: I have no control over this. The static archive is guaranteed complete, though, but of course it does not show all the replies and interactions that happened.

Reminder: spoilers abound from the very first thread.

Origins playthrough

Here are the links to the original Twitter threads for the Origins playthrough. Same as the above, some tweets might be marked unavailable for no apparent reason, whereas the static archive is complete. There are no spoilers in this one.

For the nerds: building the static archive

On paper, you'd think this is reasonably simple. Twitter lets you download an archive of your content, after all. Lots of people have made tools to turn that into HTML. Except no, because the archive download does not include alt-text, and I didn't bother typing a novel's worth of the stuff only to lose it when archiving.

Similarly, I did not want to use third-party thread archival tools that would just move my content to their servers instead of Twitter's. I'll spare you the manifesto, but I deeply believe in controlling our tech means of content production. This is why you're reading handwritten HTML, after all!

And so, step 1 of this whole adventure was to get familiar with the Twitter API. I'm a C++ dork, not a web developer or someone who works with web APIs a lot, so the whole thing was entirely new to me. I settled on python because it looked nice enough, which was also an opportunity to learn a new programming language. I ended up building a layered library of progressively less hacky scripts to pull tons and tons of data from Twitter, from my own tweets to the replies to those tweets to eventually a number of posts by the wider micro-fandom. Since the Twitter API sends you JSON, I designed a JSON-based data format that was a bit easier to work with and ended up with gigabytes of JSON tweet data, plus piles of images.

From all that data, step 2 was to isolate my own threads (and everything they were quoting, which got fun), and structuring it back into threads. That produced more JSON, one file per thread, with everything needed to generate the HTML page for each thread. Note that I'm pretending this was a linear process, when figuring out all the data that was needed actually took several iterations and re-running various steps a number of times. You could call it "Agile" I guess.

Step 3 was, of course, to generate some HTML. My first pass was bruteforcing it through very long strings, but I quickly integrated Jinja, since that's a tool I'm familiar with due to using Pelican for my other websites. As a result, I've got two templates, one for threads indexes and one for thread pages, which receive all the data needed to generate the final pages. Like the above, I'm pretending this was linear but there was a lot of back-and-forth with refining the CSS, adding the right classes and all that jazz.

And step 4 was to make it look good! That means CSS, which has always given me colossal headaches. This time I took an approach loosely inspired by CUBE CSS, Every Layout (eyestrain warning) and some implementation tricks from Utopia, and it made the whole thing go a lot smoother. Notably, adding quoted tweets was mostly a matter of copy-pasting the main tweet HTML into a parent div and stuff Just Worked.

Everything is hosted in a remote git repository because I do not trust my hard drive. Building the website is a single python script that copies handwritten files in the right place, compiles text pages into actual HTML, and processes tweet data through Jinja to create the static archives. Once that's done, I just need to take the resulting folder and upload it via FTP.

Future work

The whole thing needs an accessibility pass to ensure that it makes sense to screen readers and that aria tags are correct. I'm a complete web accessiblity noob so that will take a bit. Do contact me if you encounter any problems and especially accessibility issues: nothing replaces user data!

I'm planning to find a way to integrate replies (with consent!) into the thread pages to better replicate the community experience that took place during the playthroughs. I have the data saved, but it poses a few design and UI challenges.

I have also archived a number of "wider microfandom" tweets and artworks. All of that is intellectual property I cannot reasonably get consent for, but finding a way to make a directory of fanart links would be neat probably. That one is very pie-in-the-sky level stuff considering the required labor.