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
Original tweets links
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.
- 2020-10-14: Tech setup.
- 2020-10-14: Opening, Cebalrai, Moonguile Forest.
- 2020-10-15: Nunki Valley, Pherkad.
- 2020-10-16: Rodolfo's Mansion, finishing Sadal Suud.
- 2020-10-17: Nashira.
- 2020-10-18: Lesser Celestial River, Nashira.
- 2020-10-19: Nashira, Cloud Passage, Sheliak.
- 2020-10-20: Elnath.
- 2020-10-21: Shrine of the Winds, finishing Diadem.
- 2020-10-22: Combat explainer, Anuénué Port, Komo Mai.
- 2020-10-23: School of Magic, Corellia's Palace.
- 2020-10-24: Ancient Library of Magic.
- 2020-10-25: Holoholo Jungle, Opu.
- 2020-10-26: Komo Mai, Opu.
- 2020-10-26 cont, broken thread: Opu, Celestial Tree.
- 2020-10-27: Celestial Tree.
- 2020-10-28: Celestial Tree boss.
- 2020-11-01: Finishing Anuénué, Trail of Souls.
- 2020-11-02: Trail of Souls.
- 2020-11-03: Parnasse, Detourne.
- 2020-11-04: Detourne.
- 2020-11-05: Detourne, Parnasse.
- 2020-11-06: Reverence, Nekton.
- 2020-11-07: Nekton, Mira Drama.
- 2020-11-09: Balancoire.
- 2020-11-10: Duke's Manor, Coccolith.
- 2020-11-11: Coccolith boss.
- 2020-11-12: Finishing Mira.
- 2020-11-14: Mintaka.
- 2020-11-15: Battleship Goldoba.
- 2020-11-16: Azha.
- 2020-11-16, cont: Lava Caves.
- 2020-11-17: Azha, Lava Caves.
- 2020-11-18: Lava Caves boss, Plot Twist, Imperial Fortress.
- 2020-11-18, cont: Corellia's Palace.
- 2020-11-19: World tour, fetch quests.
- 2020-11-21: World tour, fetch quests.
- 2020-11-22: Interdimensional cracks.
- 2020-11-23: Corellia's palace, Wazn.
- 2020-11-24: Kaffaljidhma, Cursa.
- 2020-11-25: Lake of the Dragon, Kaffaljidhma.
- 2020-11-26: Finishing Wazn, Corellia's palaca, Mintaka.
- 2020-11-27: Imperial Fortress.
- 2020-11-28: Imperial Fortress boss, Mintaka.
- 2020-11-29: Labyrinth of Duhr.
- 2020-11-30: Gemma.
- 2020-12-01: Capella, Algorab.
- 2020-12-02: Zosma Tower.
- 2020-12-03: Algorab boss.
- 2020-12-04: SP combos, nothing to see here.
- 2020-12-05: Finishing Duhr, Corellia's palace, fetch quests, SP combos.
- 2020-12-06: World tour, fetch quests.
- 2020-12-07: Celestial Alps.
- 2020-12-08: Celestial Alps boss, Corellia's palace.
- 2020-12-09: Komo Mai, Illusory Fortress.
- 2020-12-10: Nashira, Greater Celestial River.
- 2020-12-11: World tour, fetch quests.
- 2020-12-12: Phantom Goldoba.
- 2020-12-13: World tour.
- 2020-12-14: Nihal Desert.
- 2020-12-15: Nihal Desert boss.
- 2020-12-16 aside: Alternate Geldoblame read.
- 2020-12-16: Zosma Tower.
- 2020-12-17: Zosma Tower boss.
- 2020-12-18: Constellations, animals, Quzman, secret recipes.
- 2020-12-18: Corellia's palace, opening Cor Hydrae.
- 2020-12-19: Cor Hydrae.
- 2020-12-20: Cor Hydrae.
- 2020-12-21: Cor Hydrae.
- 2020-12-22: Cor Hydrae boss, 100% achieved.
- 2020-12-23 aside: Victory Banquet interpretations hot take.
- 2020-12-23: Cor Hydrae boss, Victory Banquet.
- 2020-12-23, cont: Moonguile Forest, ending.
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.
- 2021-04-15: Setup, UI complaints, Dark Service HQ.
- 2021-04-19: Emperor's Residence, WHAT IS GOING ON.
- 2021-04-20: Albali Sandhollow, Rasalas, Mintaka sewers.
- 2021-04-21: Mintaka sewers, Mintaka.
- 2021-04-22: Mintaka, Giacomo, Baelheit and Shanath's plotting, Hassaleh, Nusakan Thornwood.
- 2021-04-24: Nusakan Thornwood, Sheratan, too many sexist jokes.
- 2021-04-25: Sheratan, Lake Botein ruins, more Sheratan.
- 2021-04-26: Lake Botein.
- 2021-04-27: Sheratan, Valara, Rasalas, Sandfeeders' Nest.
- 2021-04-28: Sheratan, Sedna, Mintaka.
- 2021-05-02: Mintaka, Coliseum, why does Sagi keep getting hit on by adult women, Dark Service HQ, Nihal Desert.
- 2021-05-04: Greater Mintaka, funeral, candidate speeches and bombing.
- 2021-05-07: Greater Mintaka, Verus, Nihal Desert.
- 2021-05-08: Azha.
- 2021-05-10: Nihal Desert's SECRET CAVE.
- 2021-05-12: Greater Mintaka, Azha investigation.
- 2021-05-22: Greater Mintaka investigation, Azha interrogations.
- 2021-05-26: Azha interrogations.
- 2021-05-28: Lava Caves, Naos.
- 2021-06-10: Naos, Lava Caves escape, Azha.
- 2021-06-15: Sedna, Greater Mintaka, Baelheit.
- 2021-07-30: Emperor's Residence, Secret tunnel, Verus, more Baelheit and Shanath being evil.
- 2021-07-31: Mintaka, mailtime.
- 2021-08-01: Sidequests distractions, Sheliak, Elnath.
- 2021-08-02: Elnath.
- 2021-08-03: Lesser Celestial River / Cloud Passage.
- 2021-08-04: More distractions, Lesser Celestial River / Cloud Passage.
- 2021-08-05: Nashira.
- 2021-08-06: Doing Nashira wrong see what happens.
- 2021-08-07: Cloud Passage, Giacomo, Sheliak.
- 2021-08-09: Sidequests.
- 2021-08-12: More sidequests.
- 2021-08-14: Elnath, Cloudvents, Naos, Matar Highlands.
- 2021-08-15: Cujam, Cloudvents, Elnath.
- 2021-08-17: Diadem dialogue chasing.
- 2021-08-18: Cloudvents sidequest, Nasca, Skeed and Vallye learn martial arts.
- 2021-08-19: Missed dialogue in Azha, Verus lore dump.
- 2021-08-19: Pherkad posters part 1.
- 2021-08-22: Pherkad posters part 2.
- 2021-08-23: Pherkad, back to Nashira and Sheratan.
- 2021-08-25: Nunki Valley, Cebalrai.
- 2021-08-26: Cebalrai, Rodolfo's Estate.
- 2021-08-27: Rodolfo's Estate, Giacomo.
- 2021-08-29: Running errands in Pherkad and Azha.
- 2021-08-30: Running errands in Sedna and Elnath.
- 2021-08-31: Pac and upgrades flavor text.
- 2021-09-01: Nunki Valley burning, Cebalrai.
- 2021-09-05: Heughes, Cujam, Naos tragedy.
- 2021-09-06: Zaurak Keep.
- 2021-09-07: Zaurak Keep, Nunki Valley ft. Palolo saves the day, Cebalrai, Pherkad.
- 2021-09-08: Loose ends on Sadal Suud.
- 2021-09-09: Sidequests, Skeed and Vallye learn farming, checking on Heughes and Sheratan and Diadem.
- 2021-09-10: Stalker sidequest, Verus, off to disk 2 and Anuénué, Bird Problem solved on first try.
- 2021-09-13: Holoholo Jungle, Library of Magic, Anuénué Port, Komo Mai
- 2021-09-14: Komo Mai
- 2021-09-15: Running cookie errands, rigging elections, meeting the queen, saving the animals in the jungle.
- 2021-09-17: Holoholo Jungle, more electoral fraud.
- 2021-09-19: School of Magic, more electoral fraud, Holoholo Jungle, Opu.
- 2021-09-22: Sedna and Komo Mai loose ends, Celestial Tree, back to Komo Mai, Celestial Tree Veinroots.
- 2021-09-22: Celestial Tree Veinroots, checking on the rest of Anuénué.
- 2021-09-24: Celestial Tree Veinroots boss, Zaurak Keep.
- 2021-09-25: Zaurak Keep, Big Reveal about Malpercio's origins.
- 2021-09-26: Check on the Unknown World, Cujam, Battlefields of Atria, Valara, Sagi has had enough.
- 2021-09-28: Check on Anuénué.
- 2021-10-01: Finish Anuénué, fix the ship, Mintaka, Skeed and Vallye learn magic.
- 2021-10-03: Check on Hassaleh and Diadem.
- 2021-10-04: Check on Sadal Suud and Alfard.
- 2021-11-13: Loose ends in Anuénué, Greater Mintaka, summing up the mess we're in.
- 2021-11-14: Council, plot twists galore.
- 2021-11-23: Even bigger plot twist, Shanath, escaping the mysterious fortress.
- 2021-11-28: Check around Alfard, Sheratan.
- 2021-12-08: Sidequests and new dialog mostly in Sadal Suud, Skeed and Vallye learn about sibling strife, kick Heughes' ass.
- 2021-12-13: Sidequests and new dialog in Diadem, kick Nasca's ass.
- 2021-12-14: Sidequests and new dialog mostly in Anuénué, Greythorne powers unlocked, steal an election.
- 2021-12-15: Kick Valara's ass, read some mail, Greythorne adventures part 1.
- 2022-01-17: Sidequests and new dialog in Alfard, Greythorne adventures part 2, Dark Service HQ.
- 2022-01-30: Dark Service HQ.
- 2022-04-18: Sidequests and new dialog in Alfard, Greythorne adventures part 3.
- 2022-04-26: Sidequests and new dialog in Azha and Diadem, Greythorne adventures part 4.
- 2022-10-26: Mailtime, Greythorne adventures part 5, hope you wanted more weird sex jokes.
- 2022-10-28: Sidequests, plushie duty.
- 2022-10-28: Nekkar.
- 2022-10-30: Duhr, so much flavor text.
- 2022-12-24: Sidequests, Atria ominousness, Duhr, Sedna, Seginus.
- 2022-12-25: Seginus graphics shenanigans, new dialog in Duhr, Matar Highlands, sidequests, saving Gena.
- 2022-12-27: Re-check all the things, new dialog in Azha, Georg is a jerk.
- 2022-12-29: Re-check all the things, Guillo is rude, new dialog in Azha, Sheratan, the stalker sidequest sucks.
- 2022-12-31: Coliseum ranks 1, 2, 3, 4.
- 2023-01-01: Atria, Wiseman, Rasalas, Verus, Tarazed revealed.
- 2023-01-15: Re-check all the things, new dialog mostly in Alfard and Diadem, Greythorne shenanigans in Duhr, Vega, finishing Sedna.
- 2023-01-16: Coliseum rank 5, random highlights from around the Sky.
- 2023-01-21: Inner Tarazed.
- 2023-01-22: Tarazed Control, Baelheit, all the plot twists.
- 2023-02-04: Tarazed Core, Verus' secret room, the worst mixing recipe.
- 2023-02-05: Coliseum championship and advanced battles.
- 2023-02-11: Final sidequests round.
- 2023-02-11: Final bosses, Tarazed escape drama.
- 2023-02-11: Tarazed escape "true ending" version, final dialog, credits, hot takes.
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.