« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--album/beyond-canon/album.txt99
-rw-r--r--album/homestuck-vol-5/album.txt2
-rw-r--r--album/lofam3/album.txt4
-rw-r--r--album/the-wanderers/album.txt2
-rw-r--r--album/unreleased-tracks/album.txt185
-rw-r--r--client.js4
-rw-r--r--common.js12
-rw-r--r--flash/flashes.txt373
-rw-r--r--upd8.js139
9 files changed, 783 insertions, 37 deletions
diff --git a/album/beyond-canon/album.txt b/album/beyond-canon/album.txt
new file mode 100644
index 00000000..49d9caa0
--- /dev/null
+++ b/album/beyond-canon/album.txt
@@ -0,0 +1,99 @@
+Album: Beyond Canon
+Date: April 13, 2020
+Cover Art: Xamag
+Track Art: none
+FG: #f2a400
+-------------------------------------------------------------------------------
+Track: exclusion zone
+Artist: horizon
+URLs: https://homestuck.bandcamp.com/track/exclusion-zone
+-------------------------------------------------------------------------------
+Track: Now I'm a Villain
+Artist: David Ellis
+URLs: https://homestuck.bandcamp.com/track/now-im-a-villain
+References: Showtime (Original Mix)
+-------------------------------------------------------------------------------
+Track: Cosmic Carousel
+Artist: polysaw
+URLs: https://homestuck.bandcamp.com/track/cosmic-carousel
+-------------------------------------------------------------------------------
+Track: Surprise, We're Back
+Artist: Sean Gorter
+URLs: https://homestuck.bandcamp.com/track/surprise-were-back
+References: End of Act
+-------------------------------------------------------------------------------
+Track: SPLIT REALITY
+Artist: Xaurix
+URLs: https://homestuck.bandcamp.com/track/split-reality
+References: Alphamatic Replacement
+-------------------------------------------------------------------------------
+Track: Assembly
+Artist: Erik Scheele
+URLs: https://homestuck.bandcamp.com/track/assembly
+-------------------------------------------------------------------------------
+Track: Not Canon in F major, Op. 69
+Artist: Alex Votl
+URLs: https://homestuck.bandcamp.com/track/not-canon-in-f-major-op-69
+-------------------------------------------------------------------------------
+Track: The Leaving
+Artist: Marcus Carline
+Contributors: Marc Encabo (bass), Tom Kendall Hughes (drums)
+URLs: https://homestuck.bandcamp.com/track/the-leaving
+Lyrics:
+    Smoke is all I breathe,<br>is all you hear, is all in me.<br>Taste the drier air.<br>There’s nothing left.
+    Letters fill the empty space.<br>There’s so much space that’s left untouched.<br>Running scares me more than God,<br>but staying can’t sustain.
+    The sparks of fire, earthbound,<br>have found your home. Be gone now.<br>It’s not your fault, you know this.<br>But the leaving is just the same.
+    I feel the wind beneath my arms.<br>It’s warmer now than I recall.<br>Have you heard the news today?<br>They closed the school.
+    You and I have been through this,<br>have been through that, have been at ease.<br>Nothing scares me more than God,<br>and Nothing cannot sustain.
+    The sparks of fire, earthbound,<br>have found your home. Be gone now.<br>It’s not your fault, you know this.<br>But the leaving is still the same.
+    You sent me fire.<br>Fire, I’ll tear my throat out.<br>Burn my blackened lips.<br>You gave me fire.<br>Fire, I’ll tear my heart out.<br>I’d rather tear my heart out.<br>But I can’t stay here.
+    The sparks of fire earthbound<br>have found your home. Be gone now.<br>It’s not your fault, you know this.<br>But you can’t help but turn around.<br>The embers haven’t faded.<br>The love you left, unmade.<br>It’s not your fault, you know this.<br>But the leaving is still the same.
+-------------------------------------------------------------------------------
+Track: Light Burns Out (Gestalt)
+Artist: Waif
+URLs: https://homestuck.bandcamp.com/track/light-burns-out-gestalt
+-------------------------------------------------------------------------------
+Track: Hometeam Adv8ntage
+Artist: Twirlin' Curtis
+URLs: https://homestuck.bandcamp.com/track/hometeam-adv8ntage
+-------------------------------------------------------------------------------
+Track: After the Sun
+Artist: Circlejourney
+URLs: https://homestuck.bandcamp.com/track/after-the-sun
+-------------------------------------------------------------------------------
+Track: Narrative Command
+Artist: Sean William Calhoun
+URLs: https://homestuck.bandcamp.com/track/narrative-command
+-------------------------------------------------------------------------------
+Track: eleventh hour
+Artist: Monobrow
+URLs: https://homestuck.bandcamp.com/track/eleventh-hour
+-------------------------------------------------------------------------------
+Track: Adios, Lost Boys
+Artist: Clark Powell
+URLs: https://homestuck.bandcamp.com/track/adios-lost-boys
+-------------------------------------------------------------------------------
+Track: Moving Onwards
+Artist: Matthias Ramalho
+URLs: https://homestuck.bandcamp.com/track/moving-onwards
+-------------------------------------------------------------------------------
+Track: Make a Pretty Picture
+Artist: Tristan Scroggins
+URLs: https://homestuck.bandcamp.com/track/make-a-pretty-picture
+-------------------------------------------------------------------------------
+Track: Four Kids (and a Game They Played Together)
+Artist: Robert J! Lake
+References: Four Kids and a Game They Play Together
+URLs: https://homestuck.bandcamp.com/track/four-kids-and-a-game-they-played-together
+Lyrics:
+    it’s been a little bit since the last time we all talked<br>so...how are all of you doing?<br>i know that i have been a bit unkind to you all<br>and i’m trying to undo it
+    we thought this ended years ago but it survived<br>i've forgotten far too often why i even recognize these faces<br>that don't have names placed with them<br>inside my hazy brain, but then<br>there's too much to begin to touch on here
+    i’m<br>pulled back<br>once again<br>and i told myself,<br>told myself,<br>told myself<br>i wouldn’t be on this adventure
+    but i’m haunted by<br>all of these memories<br>that i have of four kids<br>and the game they played together
+    i burned the bridges thoroughly but still everyone's trusting me again<br>and i should be relieved but it happened so suddenly<br>and i know in my heart i haven't earned this,<br>but everyone acts like my concern isn't a problem<br>like nothing is wrong with my very involvement
+    but i know how the song ends
+    i can’t begin to list the times that i’ve walked<br>along this road and concluded<br>that nothing that i’ve done here will make sense, in the end<br>but i find that kind of soothing
+-------------------------------------------------------------------------------
+Track: crystal hung in firmament's descent
+Artist: Emelia K.
+URLs: https://homestuck.bandcamp.com/track/crystal-hung-in-firmaments-descent
diff --git a/album/homestuck-vol-5/album.txt b/album/homestuck-vol-5/album.txt
index a7fd4b83..8fb2b982 100644
--- a/album/homestuck-vol-5/album.txt
+++ b/album/homestuck-vol-5/album.txt
@@ -502,4 +502,4 @@ References: Homestuck Anthem
 URLs: https://homestuck.bandcamp.com/track/homestuck-2
 Commentary:
     <i>Mark Hadley:</i>
-    Plazmataz came up with a melody to use as an anthem for Homestuck, which he then used in Homestuck Anthem. While that was a very driving melody, I opted to come up with something that might be more suitable for credits (opening or end) or a title screen. I really like how this came out; it sounds a bit moody, but still optimistic, which is what I was aiming for.
+    Plazmataz came up with a melody to use as an anthem for Homestuck, which they then used in Homestuck Anthem. While that was a very driving melody, I opted to come up with something that might be more suitable for credits (opening or end) or a title screen. I really like how this came out; it sounds a bit moody, but still optimistic, which is what I was aiming for.
diff --git a/album/lofam3/album.txt b/album/lofam3/album.txt
index f42d942d..ecd440f6 100644
--- a/album/lofam3/album.txt
+++ b/album/lofam3/album.txt
@@ -220,7 +220,7 @@ Commentary:
     This piece has a bit of back story that I made up and I suppose I might've been more than a little self-indulgent here with my otp, but it's what the song made me think of. So the idea is that Dirk and Jake are adventuring together on lomax with Sawtooth and Squarewave (who are providing the hip hop backdrop). I imagine Dirk would be very controlling during tomb raids and such, taking the leader role, or at least being manipulative in some way. I think this would really make Jake feel uncomfortable and.... (wait for it) uncertain about his feelings towards Dirk. I think the song's vibe really matches this as well with the cool electronic instrumentation (Dirk) and the walk around looping anxiousness of it (Jack and his adventuring).
 -------------------------------------------------------------------------------
 Track: Hymn of the Horrorterrors
-Artist: totalspiffage
+Artist: Tamara Fritz
 Track Art: ladylovelycocks
 URLs: https://unofficialmspafans.bandcamp.com/track/hymn-of-the-horrorterrors
 Lyrics:
@@ -228,7 +228,7 @@ Lyrics:
     I FEEL POWERLESS - SHITA FO GLUTHINJO<br>I FEEL THE HORRORTERRORS' CRIES - SHITA GLUTHINKLET TUTAK TERSH<br>THE DARKNESS DEEP WITHIN - TUKLENGET FORIN JO<br>THE ENDLESS TEMPTATION - TUTORKLIB FORTU FERSH<br>MAY I BE FREE SOON - FUTMA KUL SHEMTOR
     SHOW ME THROUGH THE DARK - MIRMI ETIN TUKLET<br>I FEEL THE GREEN LIGHT - SHITA WIRG FLUKET<br>AROUND ME - JAR MA<br>WITH ME - FU MA<br>AND SOON MAY I BE - TI NU, FUTMA<br>MAY I BE SET FREE SOON - FUTMA KUL SHEMTOR
 Commentary:
-    <i>totalspiffage:</i>
+    <i>Tamara Fritz:</i>
     This is a piece entirely done in a constructed language entirely created by me. Deatils can be found on <a href="https://melodystuckrosearchive.tumblr.com/post/40875330244/hymn-of-the-horrorterrors-futma-kul-shemtor-be">the original post</a> on tumblr found on the 'melodystuckrose' blog.
     <i><b>Brad Griffin:</b></i>
     Pretty would be an understatement.
diff --git a/album/the-wanderers/album.txt b/album/the-wanderers/album.txt
index 2ab19be2..106304d0 100644
--- a/album/the-wanderers/album.txt
+++ b/album/the-wanderers/album.txt
@@ -55,7 +55,7 @@ Commentary:
 Track: Requiem for an Exile
 Artist: Tyler Dever, Solatrus
 Contributors: Solatrus (production)
-References: Requiem
+References: Requiem:requiem
 Track Art: Zilleniose
 URLs: https://youtu.be/aAphwUVKFm4
 Commentary:
diff --git a/album/unreleased-tracks/album.txt b/album/unreleased-tracks/album.txt
index 0ec0807b..a8755512 100644
--- a/album/unreleased-tracks/album.txt
+++ b/album/unreleased-tracks/album.txt
@@ -29,11 +29,34 @@ URLs:
 - https://www.youtube.com/watch?v=wa2K_8Ff41M
 - https://fwugradiation.tumblr.com/post/13528293577/improvised-touhou-music-with-annoying-commentary
 -------------------------------------------------------------------------------
+Track: beekeeper who? i dont know her.
+Artist: James Roach
+URLs:
+- https://soundcloud.com/jamesroachmusic/beekeeper-who-i-dont-know-her
+- https://www.youtube.com/watch?v=nYI7F5FHTmA
+Commentary:
+    <i>James Roach:</i>
+    this track presented a unique problem in that i didn't want to write it at the time. I had written a really somber and melancholic track for the area outside the hive (the farm in the concept art) and changing it into something a little goofier and weird presented a unique difficulty for me. I just didn't know what to do for the first time in like actual YEARS i had no idea where to even start. I kept at it for a very long time and eventually just muscled through it with sheer force of will. People often ask me the hardest track or my least favorite to work on. it was this one. silver lining: its also become one of my favorites. i love how it came out. thats the power of determination. did you know you can't say determination anymore.
+    this was written for, yes, the fabled beekeeper troll that nobody will talk about. its become some sort of myth as to what happened to her but the truth isn't that exciting. in early hiveswap days each member of the crew got to "pick" a character that they could choose one design element of. The person who picked beekeeper just had a fantroll based off of herself. they also just... drew micro/macro porn of themselves? a power move, honestly. I met them in person and they offered me weed within literal minutes of meeting so i mean i guess they seemed nice. when they no longer worked for the company it was just simpler to redesign the character than deal with literally any of that. mystewy sowved :)
+    at the point in production where they were figuring out names/personalities/traits they kinda thrust this one on me because it "would make the most people angry." beekeeper troll was beloved by a very specific kind of horny dude. you know the kind that regularly says "lewds" or w/e. nothin wrong with that i guess. chase your bliss. but in an effort by my SO CALLED FRIENDS to antagonize me, they were like "heh h h e h he e e he h what if we make this cute girl character that hornyboys love into a dumpy little round dude and then say we based him off james who they already do not like."
+    thanks guys.
+    anyway zebede's bullet points and even his name are references to me but thats kinda where it ends. st. james son of zebedee is also known as santiago, which is my birthname. the tongva were "maybe" the indigenous people of long beach, where i live, which is "too far to visit" which is a joke about The Greater Los Angeles Area. I live 20 minutes away. cowards.
+-------------------------------------------------------------------------------
+Track: Charun's Cave
+Artist: Toby Fox
+URLs: https://www.youtube.com/watch?v=wc5iruoYLXM
+-------------------------------------------------------------------------------
 Track: Crab Waltz
 Artist: Toby Fox
 References: Crustacean
 URLs: https://www.youtube.com/watch?v=jUly2ujqDvY
 -------------------------------------------------------------------------------
+Track: DaJam
+Artist: Alexander Rosetti
+URLs:
+- https://www.youtube.com/watch?v=fY4bgz4o8QY
+- https://soundcloud.com/albatrosssoup/totallynotmegaman
+-------------------------------------------------------------------------------
 Track: Darling Dolorosa
 Artist: Toby Fox
 References: Darling Kanaya
@@ -106,10 +129,29 @@ URLs:
 - https://www.youtube.com/watch?v=RIq4GrMv96I
 - https://www.youtube.com/watch?v=OdntMzdkFnk
 -------------------------------------------------------------------------------
+Track: Requiem
+Artist: Clark Powell
+Directory: requiem-labyrinths-heart
+References: Serenade
+URLs:
+- https://clarkpowell.bandcamp.com/track/requiem
+- https://www.youtube.com/watch?v=3kWFQy0kWC4
+------------------------------------------------------------------------------
+Track: Riches to Ruins Movement II
+Artist: Toby Fox
+References: Riches to Ruins Movements I & II
+URLs: https://www.youtube.com/watch?v=mNu1KAi0Prk
+-------------------------------------------------------------------------------
 Track: Secret ROM
 Artist: Toby Fox
 URLs: https://www.youtube.com/watch?v=ercVSU3rjrc
 -------------------------------------------------------------------------------
+Track: Single Female Lawyer
+Artist: Alexander Rosetti
+URLs:
+- https://www.youtube.com/watch?v=4Q2dS1Z2p9g
+- https://soundcloud.com/albatrosssoup/seer-of-same-color-scalemate-combos
+-------------------------------------------------------------------------------
 Track: Skaian Shuffle
 Artist: Clark Powell
 URLs: https://archive.homestuck.net/wl/?id=bBs1qkrvHtZIpfhl7XCLoBX7o41d3nEE&path=Homestuck%20Sound%20Test%2F~Disc%203~%20Unreleased%20Homestuck%20Music%20Team%20Music%2F059%20Skaian%20Shuffle.mp3&mode=default
@@ -152,3 +194,146 @@ Track: XROM
 Artist: Toby Fox
 References: Secret ROM
 URLs: https://www.youtube.com/watch?v=wY2nX_b9Gm4
+-------------------------------------------------------------------------------
+Track: sometimes i call andrew hussie 'andy' and so far he hasn't corrected me
+Artist: James Roach
+URLs:
+- https://soundcloud.com/jamesroachmusic/pesterquest-sometimes-i-call-andrew-hussie-andy-and-so-far-he-hasnt-corrected-me
+- https://www.youtube.com/watch?v=xSrT-SDN-uA
+References: Showtime (Piano Refrain), Homestuck
+Commentary:
+    <i>James Roach:</i>
+    SO! PesterQuest is out. We've been sitting on this one for a while. This first route has been done for a while. It was supposed to come out back on 6/12 but our new publisher had us sit on it for reasons that are beyond even me. Anyway, big ups to Malcolm and Mark for letting me use their themes.
+    I don't know if I'll have as much time or energy to do the tracks for pesterquest like i did for friendsim since i got a new job. I will try my best.
+-------------------------------------------------------------------------------
+Track: please support The Trevor Project
+Artist: James Roach
+URLs:
+- https://soundcloud.com/jamesroachmusic/pesterquest-please-support-the-trevor-project
+- https://www.youtube.com/watch?v=urbot0kfsz8
+References: Endless Climb
+Commentary:
+    <i>James Roach:</i>
+    I wasn't certain how to approach this one. I knew if I was going to use the theme from endless climb it wouldn't feel right accepting any money for it. These things don't exactly pay well to begin with tbh, so i thought I would use the platform i've been given to try and do something... even a little positive.
+    at first the song was just going to be called "play the rain" because naming it something stupid, while keeping up with tradition, seemed like it would be in bad taste. at some point while i was working on it i started looking into various charities i could donate the proceeds to, and it hit me that i could just ask to make the title in the credits a link to the charity.
+    suicide is something that is hard for me to talk about. its very personal. i tend to internalize feelings in order not to.. bother anyone. a few months ago i called a suicide hotline when i hit a really low point and i think just the act of calling made me feel... in charge somehow? feelings are fucked up. don't be afraid to talk to someone. even if it is a stranger at the other end of a call. take that step. you're not bad for feeling that way.
+    so anyway. endless climb was one of the very first homestuck songs that really drew me in, and doing a cover of it all those years ago really got me back into taking composition seriously. it could easily be argued that this song changed my life for the better.
+    if you want to know more about the trevor project, or just suicide prevention in general visit <a href="https://www.thetrevorproject.org/">thetrevorproject.org</a>
+-------------------------------------------------------------------------------
+Track: 2chords
+Artist: James Roach
+URLs: https://www.youtube.com/watch?v=Q3JQPZ2T03k
+-------------------------------------------------------------------------------
+Track: ill probably just name this one something normal oh no wait oh jeez aw beans
+Artist: James Roach
+URLs:
+- https://soundcloud.com/jamesroachmusic/pesterquest-ill-probably-just-name-this-one-something-normal-oh-no-wait-oh-jeez-aw-beans
+- https://www.youtube.com/watch?v=DREQ4rJUXXQ
+References: Davesprite
+Commentary:
+    <i>James Roach:</i>
+    well cats outta the bag i did the dave route. when andrew approached me about writing it i had very little writing experience outside of my personal projects. im glad andrew had faith in me and i hope you guys like it. itll come out at 11 AM EDT.
+    for this one and the next routes music im gonna try and keep with the tradition of uploading it the morning of.
+-------------------------------------------------------------------------------
+Track: 24/7 lo fi anime beats to question your sexuality to
+Artist: James Roach
+URLs:
+- https://soundcloud.com/jamesroachmusic/pesterquest-247-lo-fi-anime-beats-to-question-your-sexuality-to
+- https://www.youtube.com/watch?v=0I2ufAhRbf0
+References: 2chords, Upward Movement (Dave Owns), Sburban Jungle
+Commentary:
+    <i>James Roach:</i>
+    i just wanted to do more than one song so i did two and a half. hope you like it. thanks for all the support! also im in this image can u find me LMAO
+    <img src="misc/lo-fi-cover.jpg" alt="Pesterquest art of the inside of an Olive Garden, packed with Homestuck team members.">
+-------------------------------------------------------------------------------
+Track: CAREFREE VICTORY (REMIX)
+Artist: James Roach
+Contributors: Speak-N-Say (featuring)
+URLs:
+- https://soundcloud.com/jamesroachmusic/pesterquest-james-roach-ft-speak-n-say-carefree-victory-remix
+- https://www.youtube.com/watch?v=c8aZFD8ic9A&
+References: Carefree Action, Carefree Victory
+Commentary:
+    <i>James Roach:</i>
+    jades theme! wow we've really come a long way huh fellas?
+    i always really liked carefree victory and its really one of the only songs that felt like uniquely hers. towards the end i try and do something that like... every homestuck musician i think tries at least once: getting all 4 of the kid's instruments to play something nice together. i think i did alright, i subbed in beatboxing for daves turntables cause its not like you can just carry those anywhere. i guess as opposed to johns piano?? LMAO
+    musically i have jade start on bass, and as more of her friends come in she gets a little more confident in her basslines. anyway thats my fanfic.
+    this is the last new piece i'll be doing for the forseeable future, or until i feel like doing another one which might be immediately. ive been doing this on a largely volunteer basis for a while since the budget constraints were tight and we need to pay the bg and sprite artists a reasonable amount. I wanted all four kids to have music by me and i think we'll be digging into the homestuck archive for other stuff.
+    anyway i hope you've enjoyed the ride! its been a little bittersweet at times for me but i'll miss posting new stuff every two weeks.
+-------------------------------------------------------------------------------
+Track: CRUSTacean
+Directory: crustacean-pq
+Artist: James Roach
+URLs:
+- https://soundcloud.com/jamesroachmusic/pesterquest-crustacean
+- https://www.youtube.com/watch?v=9hdPSPGCK3Q
+References: Crustacean
+Commentary:
+    <i>James Roach:</i>
+    there are a handful of people out there who really thought we were just gonna put karkalicious in there.
+-------------------------------------------------------------------------------
+Track: CH3CK TH3 M3T4D4T4
+Artist: James Roach
+URLs:
+- https://soundcloud.com/jamesroachmusic/pesterquest-terezis-theme-ch3ck-th3-m3t4d4t4
+- https://www.youtube.com/watch?v=DuGQM9YsyXo
+References: The Lemonsnout Turnabout
+Commentary:
+    <i>James Roach:</i>
+    dont actually do that you clowns
+-------------------------------------------------------------------------------
+Track: yeah, it is
+Artist: James Roach
+Contributors: Tamara Fritz (vocals)
+URLs:
+- https://soundcloud.com/jamesroachmusic/pesterquest-aradias-theme-yeah-it-is
+- https://www.youtube.com/watch?v=MDqXkGBFPg0
+References: MeGaLoVania
+Commentary:
+    <i>James Roach:</i>
+    big ups to Tamara "TOTALSPIFFAGE" Fritz for really knocking it outta the park with these vocals.
+-------------------------------------------------------------------------------
+Track: KWCOM DOT WAV
+Artist: James Roach
+URLs: https://www.youtube.com/watch?v=zrtnPsoAkQg
+-------------------------------------------------------------------------------
+Track: THIS TIME ITS ERIDAN (I FORGOT WHAT I NAMED THIS)
+Artist: James Roach
+URLs:
+- https://soundcloud.com/jamesroachmusic/pesterquest-this-time-its-eridan-i-forgot-what-i-named-this
+- https://www.youtube.com/watch?v=sw8smnspCmU
+Commentary:
+    <i>James Roach:</i>
+    in its base form this song used to be about a cat and is like more than a decade old
+-------------------------------------------------------------------------------
+Track: i guess
+Artist: James Roach
+URLs: https://www.youtube.com/watch?v=FVKzNwxz6Vc
+-------------------------------------------------------------------------------
+Track: Would you believe this was for something else
+Artist: James Roach
+URLs: https://www.youtube.com/watch?v=eciwBYIR8_k
+-------------------------------------------------------------------------------
+Track: this is like... what was it... > [S] MSPAR: Remember
+Directory: mspar-remember
+Artist: James Roach
+URLs: https://www.youtube.com/watch?v=osip3rTivjM
+References:
+- Penumbra Phantasm
+- Rex Duodecim Angelus
+-------------------------------------------------------------------------------
+Track: normal song name
+Artist: James Roach
+URLs: https://soundcloud.com/jamesroachmusic/afterw-rd-theme-normal-song-name#t=0:00
+References:
+- Rex Duodecim Angelus
+- Moonsetter
+- Homestuck
+- Penumbra Phantasm
+- Unite Synchronization
+- MeGaLoVania
+- Homestuck Anthem
+- WORST END
+Commentary:
+    <i>James Roach:</i>
+    its over
diff --git a/client.js b/client.js
index eb3c8697..ade15878 100644
--- a/client.js
+++ b/client.js
@@ -7,7 +7,7 @@
 
 const officialAlbumData = albumData.filter(album => !album.isFanon);
 const fandomAlbumData = albumData.filter(album => album.isFanon);
-const artistNames = C.getArtistNames(albumData);
+const artistNames = C.getArtistNames(albumData, flashData);
 const allTracks = C.getAllTracks(albumData);
 
 function pick(array) {
@@ -43,7 +43,7 @@ for (const a of document.body.querySelectorAll('[data-random]')) {
                 case 'track-in-fandom': return openTrack(pick(fandomAlbumData.reduce((acc, album) => acc.concat(album.tracks), [])));
                 case 'track-in-official': return openTrack(pick(officialAlbumData.reduce((acc, album) => acc.concat(album.tracks), [])));
                 case 'artist': return openArtist(pick(artistNames));
-                case 'artist-more-than-one-contrib': return openArtist(pick(artistNames.filter(name => C.getArtistNumContributions(name, {albumData, allTracks}) > 1)));
+                case 'artist-more-than-one-contrib': return openArtist(pick(artistNames.filter(name => C.getArtistNumContributions(name, {albumData, allTracks, flashData}) > 1)));
             }
         } finally {
             evt.preventDefault();
diff --git a/common.js b/common.js
index aa782bf9..b4bf934b 100644
--- a/common.js
+++ b/common.js
@@ -65,9 +65,10 @@ const C = {
     // sorted 8y date.
     getAllTracks: albumData => C.sortByDate(albumData.reduce((acc, album) => acc.concat(album.tracks), [])),
 
-    getArtistNames: albumData => Array.from(new Set(
-        albumData.reduce((acc, album) => acc.concat((album.coverArtists || []).map(({ who }) => who), album.tracks.reduce((acc, track) => acc.concat(track.artists, (track.coverArtists || []).map(({ who }) => who)), [])), [])
-    )),
+    getArtistNames: (albumData, flashData) => Array.from(new Set([
+        ...albumData.reduce((acc, album) => acc.concat((album.coverArtists || []).map(({ who }) => who), album.tracks.reduce((acc, track) => acc.concat(track.artists, (track.coverArtists || []).map(({ who }) => who)), [])), []),
+        ...flashData.filter(flash => !flash.act8r8k).reduce((acc, flash) => acc.concat(flash.contributors.map(({ who }) => who)), [])
+    ])),
 
     getKebabCase: name => name.split(' ').join('-').replace(/&/g, 'and').replace(/[^a-zA-Z0-9\-]/g, '').replace(/-{2,}/g, '-').replace(/^-+|-+$/g, '').toLowerCase(),
 
@@ -75,15 +76,16 @@ const C = {
     // "directories", we just reformat the artist's name.
     getArtistDirectory: artistName => C.getKebabCase(artistName),
 
-    getArtistNumContributions: (artistName, {allTracks, albumData}) => [
+    getArtistNumContributions: (artistName, {allTracks, albumData, flashData}) => [
         ...allTracks.filter(track =>
             track.artists.includes(artistName) ||
             [...track.contributors, ...track.coverArtists || []].some(({ who }) => who === artistName)),
+        ...flashData.filter(flash => (flash.contributors || []).some(({ who }) => who === artistName)),
         ...albumData.filter(album =>
             (album.coverArtists || []).some(({ who }) => who === artistName))
     ].length,
 
-    getArtistCommentary: (artistName, {albumsAndTracks}) => albumsAndTracks.filter(thing => thing.commentary && thing.commentary.replace(/<\/?b>/g, '').includes('<i>' + artistName + ':</i>'))
+    getArtistCommentary: (artistName, {justEverythingMan}) => justEverythingMan.filter(thing => thing.commentary && thing.commentary.replace(/<\/?b>/g, '').includes('<i>' + artistName + ':</i>'))
 };
 
 if (typeof module === 'object') {
diff --git a/flash/flashes.txt b/flash/flashes.txt
index 6563ce6e..d56140d8 100644
--- a/flash/flashes.txt
+++ b/flash/flashes.txt
@@ -977,3 +977,376 @@ Page: 8130
 Date: October 25, 2016
 Tracks:
 - Ascend
+------------------------------------------------------------------------------
+ACT: Hiveswap Friendsim
+FG: #d3ff8f
+------------------------------------------------------------------------------
+Flash: Of Bloodthurst and Bratwurst
+Contributors:
+- Andrew Hussie (writing: Ardata, Diemen)
+- Danny Cragg (art: characters, backgrounds, endings)
+- Shelby Cragg (art: colorist)
+- David Turnbull (programming)
+Directory: fs-vol1
+Date: April 13, 2018
+Tracks: Breeding Duties, Moonshine
+------------------------------------------------------------------------------
+Flash: Of Aesthetics, Crimson and Otherwise
+Contributors:
+- Aysha U. Farah (writing: Amisia)
+- Anonymous (writing: Cirava)
+- Danny Cragg (art: characters, backgrounds, endings)
+- Shelby Cragg (art: colorist)
+- David Turnbull (programming)
+Directory: fs-vol2
+Date: April 27, 2018
+Tracks: ARTCHOP (APPARENTLY), M O I S T:moist
+------------------------------------------------------------------------------
+Flash: Of Ladies Gray and Lusii White
+Contributors:
+- Aysha U. Farah (writing: Skylla)
+- Cee L. Kyle (writing: Bronya)
+- Adrienne Garcia (art: characters, backgrounds, endings)
+- David Turnbull (programming)
+Directory: fs-vol3
+Date: May 11, 2018
+Tracks: Dapper Dueling, Phantasmagoric Waltz
+------------------------------------------------------------------------------
+Flash: Of Wright and Wronged
+Contributors:
+- Lalo Hunt (writing: Tagora)
+- Magdalena Clark (writing: Vikare)
+- Gina Chacón (art: characters, backgrounds, endings)
+- David Turnbull (programming)
+Directory: fs-vol4
+Date: May 25, 2018
+Tracks: Call me Gor-Gor, Thip of the Tongue
+------------------------------------------------------------------------------
+Flash: Of Affection, Unwanted or Untrue
+Contributors:
+- Aysha U. Farah (writing: Polypa)
+- Cee L. Kyle (writing: Zebruh)
+- Adrienne Garcia (art: characters, backgrounds, endings)
+- David Turnbull (programming)
+Directory: fs-vol5
+Date: June 8, 2018
+Tracks: Coursing, Hollow Suit
+------------------------------------------------------------------------------
+Flash: Of Text and Envy, Green
+Contributors:
+- Magdalena Clark (writing: Elwurd)
+- Aysha U. Farah (writing: Kuprum & Folykl)
+- Danny Cragg (art: characters, backgrounds, endings)
+- Mint Chipleaf (programming)
+Directory: fs-vol6
+Date: June 22, 2018
+Tracks: Superego, >tfw another james roach track:tfw-another-james-roach-track
+------------------------------------------------------------------------------
+Flash: Of Business, Flagrantly Illegal
+Contributors:
+- Cee L. Kyle (writing: Remele)
+- Aysha U. Farah (writing: Konyyl)
+- Gina Chacón (art: characters, backgrounds, endings)
+- David Turnbull (programming)
+Directory: fs-vol7
+Date: July 6, 2018
+Tracks:
+- Piwates ',$$$$^]:piwates
+- Olive Scribe
+------------------------------------------------------------------------------
+Flash: Of Stresses, Song and Otherwise
+Contributors:
+- Lalo Hunt (writing: Tyzias)
+- Aysha U. Farah (writing: Chixie)
+- Adrienne Garcia (art: characters, backgrounds, endings)
+- Mint Chipleaf (programming)
+Directory: fs-vol8
+Date: July 20, 2018
+Tracks: Single Female Lawyer, it be like that sometimes
+------------------------------------------------------------------------------
+Flash: Of Gazes Cool and Tempers Hot
+Contributors:
+- Kieran Miranda (writing: Azdaja)
+- Aysha U. Farah (writing: Chahut)
+- Gina Chacón (art: characters, backgrounds, endings)
+- Mint Chipleaf (programming)
+Directory: fs-vol9
+Date: August 3, 2018
+Tracks: DaJam, take me to clown church
+------------------------------------------------------------------------------
+Flash: Of Faraway Lands and Nearby Pals
+Contributors:
+- Aysha U. Farah (writing: Zebede)
+- Magdalena Clark (writing: Zebede)
+- David Turnbull (writing: Tegiri)
+- Adrienne Garcia (art: characters)
+- Phil Gibson (art: backgrounds, endings)
+- Angela Sham (art: backgrounds)
+Directory: fs-vol10
+Date: August 17, 2018
+Tracks:
+- beekeeper who? i dont know her.
+- ASSAULT
+------------------------------------------------------------------------------
+Flash: Of Pals and Promises, Made and Broken
+Contributors:
+- Aysha U. Farah (writing: Mallek)
+- Cee L. Kyle (writing: Lynera)
+- Adrienne Garcia (art: characters)
+- Phil Gibson (art: backgrounds, endings)
+- Mint Chipleaf (programming)
+Directory: fs-vol11
+Date: August 31, 2018
+Tracks: fortnite funny moments epic fails episode 413, Frostbite
+------------------------------------------------------------------------------
+Flash: Of Know-Nothings and Know-It-Alls
+Contributors:
+- Lalo Hunt (writing: Galekh)
+- David Turnbull (writing: Tirona)
+- Adrienne Garcia (art: characters)
+- Leland Goodman (art: backgrounds, endings)
+- Mint Chipleaf (programming)
+Directory: fs-vol12
+Date: September 14, 2018
+Tracks: Snow Pollen, Carefree Princess Berryboo
+------------------------------------------------------------------------------
+Flash: Of Fate, Fortune, and Fashion
+Contributors:
+- Aysha U. Farah (writing: Boldir)
+- Kieran Miranda (writing: Stelsa)
+- Adrienne Garcia (art: characters)
+- Phil Gibson (art: backgrounds, endings)
+- Mint Chipleaf (programming)
+Directory: fs-vol13
+Date: September 28, 2018
+Tracks: Old Secret, IIYWASWIWTBOTSA4AATWUOTDTMIHCIMFH
+------------------------------------------------------------------------------
+Flash: Of Cleanliness and Clownliness
+Contributors:
+- Aysha U. Farah (writing: Marsti)
+- Thomas Carr (writing: Karako)
+- Kim Quach (art: characters)
+- Angela Sham (art: backgrounds, endings)
+- Mint Chipleaf (programming)
+Directory: fs-vol14
+Date: October 10, 2018
+Tracks: SERVICE CAR, (an ascii image of bowsette)
+------------------------------------------------------------------------------
+Flash: Of Creatives, Conventional or Otherwise
+Contributors:
+- Kieran Miranda (writing: Charun)
+- Lalo Hunt (writing: Wanshi)
+- Adrienne Garcia (art: characters)
+- Phil Gibson (art: backgrounds, endings)
+- Mint Chipleaf (programming)
+Directory: fs-vol15
+Date: October 26, 2018
+Tracks: Charun's Cave, idk man you name it im tired
+------------------------------------------------------------------------------
+Flash: Of Cult- And Capt-ivation
+Contributors:
+- Thomas Carr (writing: Fozzer)
+- V (writing: Marvus)
+- Kim Quach (art: characters)
+- CJ Walker (art: backgrounds, endings)
+- Mint Chipleaf (programming)
+Directory: fs-vol16
+Date: November 9, 2018
+Tracks: GRAVEYARD SHIFT, CLOWNFUCKER
+------------------------------------------------------------------------------
+Flash: Of Teen and Tech, Acerbic
+Contributors:
+- Cee L. Kyle (writing: Daraya)
+- David Turnbull (writing: Nihkee, programming)
+- Adrienne Garcia (art: characters)
+- Phil Gibson (art: backgrounds)
+- Kim Quach (art: endings)
+- Mint Chipleaf (programming)
+Directory: fs-vol17
+Date: November 30, 2018
+Tracks:
+- (this title was too long)
+- turns out its like the shoe
+- END OF FRIENDVANGELION
+------------------------------------------------------------------------------
+Flash: Of Endings, Many
+Contributors:
+- V (writing: Lanque)
+- Kieran Miranda (writing: Soleil Twins)
+- Kim Quach (art: characters)
+- CJ Walker (art: backgrounds, endings)
+- Adrienne Garcia (art: colorist)
+- Mint Chipleaf (programming)
+Directory: fs-vol18
+Date: December 14, 2018
+Tracks:
+- yall know i just do the music right
+- VALID END
+- the final clowntdown
+------------------------------------------------------------------------------
+Flash: Of Hosts, Excellent
+Contributors:
+- Aysha U. Farah (writing)
+- Lalo Hunt (writing)
+- Kim Quach (art: characters)
+- Phil Gibson (art: endings)
+- Mint Chipleaf (programming)
+Directory: fs-epilogue
+Date: December 14, 2018
+Tracks: WORST END
+------------------------------------------------------------------------------
+ACT: Pesterquest
+FG: #71daff
+------------------------------------------------------------------------------
+Flash: Magic Is Fucking Real
+Contributors:
+- Aysha U. Farah (writing: Prologue)
+- Andrew Hussie (writing: John, art: backgrounds)
+- Kim Quach (art: characters)
+- Xamag (art: backgrounds, endings)
+Directory: pq-vol1
+Date: September 4, 2019
+Tracks:
+- WORST END
+- sometimes i call andrew hussie 'andy' and so far he hasn't corrected me
+------------------------------------------------------------------------------
+Flash: Something Beyond The Sky
+Contributors:
+- Aysha U. Farah (writing)
+- Breya Rivera (art: characters)
+- Courtney Brendle (art: backgrounds, endings)
+Directory: pq-vol2
+Date: September 4, 2019
+Tracks: please support The Trevor Project
+------------------------------------------------------------------------------
+Flash: A King's Feast of Ass
+Contributors:
+- James Roach (writing)
+- Gina Chacón (art: characters)
+- Xamag (art: backgrounds, endings)
+Directory: pq-vol3
+Date: September 18, 2019
+Tracks:
+- 2chords
+- ill probably just name this one something normal oh no wait oh jeez aw beans
+- 24/7 lo fi anime beats to question your sexuality to
+------------------------------------------------------------------------------
+Flash: The Loneliest Girl In The World
+Contributors:
+- David Turnbull (writing)
+- Breya Rivera (art: characters)
+- Courtney Brendle (art: backgrounds, endings)
+Directory: pq-vol4
+Date: October 2, 2019
+Tracks: CAREFREE VICTORY (REMIX)
+------------------------------------------------------------------------------
+Flash: Skip to The Trolls
+Contributors:
+- Aysha U. Farah (writing: Karkat)
+- Magdalena Clark (writing: Kanaya)
+- Gina Chacón (art: characters)
+- Phil Gibson (art: backgrounds, endings)
+Directory: pq-vol5
+Date: October 16, 2019
+Tracks: CRUSTacean:crustacean-pq, Darling Kanaya
+------------------------------------------------------------------------------
+Flash: Clowns and Corsairs
+Contributors:
+- Aysha U. Farah (writing: Gamzee)
+- Kate Mitchell (writing: Vriska)
+- Haven Daniels-Taylor (art: characters)
+- Courtney Brendle (art: backgrounds, endings)
+Directory: pq-vol6
+Date: October 30, 2019
+Tracks: mIrAcLeS, Superego
+------------------------------------------------------------------------------
+Flash: Dragons and Dairy
+Contributors:
+- Lalo Hunt (writing: Equius)
+- Sarah Zedig (writing: Terezi)
+- Xamag (art: characters)
+- Gina Chacón (art: backgrounds, endings)
+Directory: pq-vol7
+Date: November 13, 2019
+Tracks: CH3CK TH3 M3T4D4T4, Indigo Heir
+------------------------------------------------------------------------------
+Flash: Team Charge
+Contributors:
+- David Turnbull (writing: Tavros)
+- James Roach (writing: Aradia)
+- Breya Rivera (art: characters)
+- Courtney Brendle (art: backgrounds, endings)
+Directory: pq-vol8
+Date: December 5, 2019
+Tracks:
+- Bronze Rebel
+- yeah, it is
+------------------------------------------------------------------------------
+Flash: Blood and Binary
+Contributors:
+- Aysha U. Farah (writing: Nepeta)
+- Anonymous 2.0 (writing: Sollux)
+- Haven Daniels-Taylor (art: Nepeta, Pounce)
+- Gina Chacón (art: Sollux)
+- Charlie Flocke (art: backgrounds, endings)
+Directory: pq-vol9
+Date: December 20, 2019
+Tracks: Requiem, KWCOM DOT WAV
+------------------------------------------------------------------------------
+Flash: Wow Pesterquest Your Mom Lets You Have Two Fish ?
+Contributors:
+- Griever (writing: Eridan)
+- Thomas Carr (writing: Feferi)
+- Kim Quach (art: characters)
+- Gina Chacón (art: backgrounds, endings)
+Directory: pq-vol10
+Date: January 15, 2020
+Tracks:
+- THIS TIME ITS ERIDAN (I FORGOT WHAT I NAMED THIS)
+- The La2t Frontiier
+- Love You (Feferi's Theme)
+------------------------------------------------------------------------------
+Flash: The Call Of Leadership
+Contributors:
+- Pip Dillistone (writing)
+- Gina Chacón (art: characters)
+- Courtney Brendle (art: backgrounds, endings)
+Directory: pq-vol11
+Date: February 5, 2020
+Tracks: i guess
+------------------------------------------------------------------------------
+Flash: Thats right ADVENTURE!!!!
+Contributors:
+- Magdalena Clark (writing)
+- Breya Rivera (art: characters)
+- Gina Chacón (art: backgrounds, endings)
+Directory: pq-vol12
+Date: February 19, 2020
+Tracks: Riches to Ruins Movement II
+------------------------------------------------------------------------------
+Flash: Friendship Wozard
+Contributors:
+- Lalo Hunt (writing)
+- Haven Daniels-Taylor (art: characters)
+- Courtney Brendle (art: backgrounds, endings)
+Directory: pq-vol13
+Date: March 4, 2020
+Tracks:
+- Would you believe this was for something else
+- Even in Death (T'Morra's Belly Mix)
+------------------------------------------------------------------------------
+Flash: Just Go Ahead Now
+Contributors:
+- Lalo Hunt (writing: Dirk)
+- Aysha U. Farah (writing: Afterw@rd)
+- Gina Chacón (art: characters)
+- Courtney Brendle (art: backgrounds, endings)
+Directory: pq-vol14
+Date: April 1, 2020
+Tracks:
+- Stress
+- Beatup
+- Unite Synchronization
+- this is like... what was it... > [S] MSPAR$$$$ Remember:mspar-remember
+- normal song name
+- Embittered Shore
diff --git a/upd8.js b/upd8.js
index dc6b5cf9..3c28ee9d 100644
--- a/upd8.js
+++ b/upd8.js
@@ -156,7 +156,7 @@ let artistNames;
 
 let officialAlbumData;
 let fandomAlbumData;
-let tracksAndAlbums;
+let justEverythingMan; // tracks, albums, flashes
 
 // Note there isn't a 'find track data files' function. I plan on including the
 // data for all tracks within an al8um collected in the single metadata file
@@ -309,7 +309,7 @@ function transformMultiline(text) {
     const outLines = [];
 
     let inList = false;
-    for (const line of text.split('\n')) {
+    for (const line of text.split(/\r|\n|\r\n/)) {
         if (line.startsWith('- ')) {
             if (!inList) {
                 outLines.push('<ul>');
@@ -574,16 +574,22 @@ async function processFlashDataFile(file) {
 
         const name = getBasicField(section, 'Flash');
         let page = getBasicField(section, 'Page');
+        let directory = getBasicField(section, 'Directory');
         let date = getBasicField(section, 'Date');
         const jiff = getBasicField(section, 'Jiff');
         const tracks = getListField(section, 'Tracks');
+        const contributors = getContributionField(section, 'Contributors') || [];
 
         if (!name) {
             return {error: 'Expected "Flash" (name) field!'};
         }
 
-        if (!page) {
-            return {error: 'Expected "Page" field!'};
+        if (!page && !directory) {
+            return {error: 'Expected "Page" or "Directory" field!'};
+        }
+
+        if (!directory) {
+            directory = page;
         }
 
         if (!date) {
@@ -600,12 +606,13 @@ async function processFlashDataFile(file) {
             return {error: 'Expected "Tracks" field!'};
         }
 
-        return {name, page, date, tracks, act, theme, jiff};
+        return {name, page, directory, date, contributors, tracks, act, theme, jiff};
     });
 }
 
 function getDateString({ date }) {
-    return date.toLocaleDateString();
+    const pad = val => val.toString().padStart(2, '0');
+    return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
 }
 
 function stringifyAlbumData() {
@@ -618,6 +625,16 @@ function stringifyAlbumData() {
     }, 1);
 }
 
+function stringifyFlashData() {
+    return JSON.stringify(flashData, (key, value) => {
+        if (['act', 'commentary'].includes(key)) {
+            return undefined;
+        }
+
+        return value;
+    }, 1);
+}
+
 // 8asic function for writing any site page. Handles all the 8asename,
 // directory, and site-template shenanigans!
 async function writePage(directoryParts, title, body) {
@@ -711,7 +728,7 @@ function writeMiscellaneousPages() {
                     </div>
                     <div class="grid-listing">
                         ${flashData.map(flash => flash.act8r8k ? fixWS`
-                            <h2 style="${getThemeString(flash.theme)}"><a href="${C.FLASH_DIRECTORY}/${getFlashDirectory(flashData.find(f => f.page && f.act === flash.act))}/index.html">${flash.act}</a></h2>
+                            <h2 style="${getThemeString(flash.theme)}"><a href="${C.FLASH_DIRECTORY}/${getFlashDirectory(flashData.find(f => !f.act8r8k && f.act === flash.act))}/index.html">${flash.act}</a></h2>
                         ` : fixWS`
                             <a class="grid-item" href="${C.FLASH_DIRECTORY}/${getFlashDirectory(flash)}/index.html" style="${getThemeString(flash.theme)}">
                                 <img src="${getFlashCover(flash)}">
@@ -755,6 +772,7 @@ function writeMiscellaneousPages() {
         writeFile('data.js', fixWS`
             // Yo, this file is gener8ted. Don't mess around with it!
             window.albumData = ${stringifyAlbumData()};
+            window.flashData = ${stringifyFlashData()};
         `)
     ]);
 }
@@ -920,8 +938,9 @@ async function writeArtistPage(artistName) {
         track.artists.includes(artistName) ||
         track.contributors.some(({ who }) => who === artistName)
     ));
-    const artThings = tracksAndAlbums.filter(thing => (thing.coverArtists || []).some(({ who }) => who === artistName));
-    const commentaryThings = tracksAndAlbums.filter(thing => thing.commentary && thing.commentary.replace(/<\/?b>/g, '').includes('<i>' + artistName + ':</i>'));
+    const artThings = justEverythingMan.filter(thing => (thing.coverArtists || []).some(({ who }) => who === artistName));
+    const flashes = flashData.filter(flash => (flash.contributors || []).some(({ who }) => who === artistName));
+    const commentaryThings = justEverythingMan.filter(thing => thing.commentary && thing.commentary.replace(/<\/?b>/g, '').includes('<i>' + artistName + ':</i>'));
 
     const unreleasedTracks = tracks.filter(track => track.album.directory === C.UNRELEASED_TRACKS_DIRECTORY);
     const releasedTracks = tracks.filter(track => track.album.directory !== C.UNRELEASED_TRACKS_DIRECTORY);
@@ -958,6 +977,7 @@ async function writeArtistPage(artistName) {
                         unreleasedTracks.length && `<a href="${index}#unreleased-tracks">(Unreleased Tracks)</a>`
                     ].filter(Boolean).join(' '),
                     artThings.length && `<a href="${index}#art">Art</a>`,
+                    flashes.length && `<a href="${index}#flashes">Flashes &amp; Games</a>`,
                     commentaryThings.length && `<a href="${index}#commentary">Commentary</a>`
                 ].filter(Boolean).join(', ')}</p>
                 ${tracks.length && `<h2 id="tracks">Tracks</h2>`}
@@ -981,6 +1001,19 @@ async function writeArtistPage(artistName) {
                         `;
                     }, true, 'artDate')}
                 `}
+                ${flashes.length && fixWS`
+                    <h2 id="flashes">Flashes &amp; Games</h2>
+                    ${actChunkedList(flashes, flash => {
+                        const contributionString = flash.contributors.filter(({ who }) => who === artistName).map(getContributionString).join(' ');
+                        return fixWS`
+                            <li>
+                                <a href="${C.FLASH_DIRECTORY}/${flash.directory}/index.html" style="${getThemeString(flash.theme)}">${flash.name}</a>
+                                ${contributionString && `<span class="contributed">(${contributionString})</span>`}
+                                (${getDateString({date: flash.date})})
+                            </li>
+                        `
+                    })}
+                `}
                 ${commentaryThings.length && fixWS`
                     <h2 id="commentary">Commentary</h2>
                     ${albumChunkedList(commentaryThings, thing => {
@@ -1030,15 +1063,48 @@ function albumChunkedList(tracks, getLI, showDate = true, dateProperty = 'date')
     `;
 }
 
+function actChunkedList(flashes, getLI, showDate = true, dateProperty = 'date') {
+    return fixWS`
+        <dl>
+            ${flashes.slice().sort((a, b) => a[dateProperty] - b[dateProperty]).map((flash, i, sorted) => {
+                const li = getLI(flash, i);
+                const act = flash.act;
+                const previous = sorted[i - 1];
+                if (i === 0 || act !== previous.act) {
+                    const heading = fixWS`
+                        <dt>
+                            <a href="${C.FLASH_DIRECTORY}/${sorted.find(flash => !flash.act8r8k && flash.act === act).directory}/index.html" style="${getThemeString(flash.theme)}">${flash.act}</a>
+                        </dt>
+                        <dd><ul>
+                    `;
+                    if (i > 0) {
+                        return ['</ul></dd>', heading, li];
+                    } else {
+                        return [heading, li];
+                    }
+                } else {
+                    return [li];
+                }
+            }).reduce((acc, arr) => acc.concat(arr), []).join('\n')}
+        </dl>
+    `;
+}
+
 async function writeFlashPages() {
-    await progressPromiseAll('Writing Flash pages.', queue(flashData.map(flash => () => flash.page && writeFlashPage(flash)).filter(Boolean)));
+    await progressPromiseAll('Writing Flash pages.', queue(flashData.map(flash => () => !flash.act8r8k && writeFlashPage(flash)).filter(Boolean)));
 }
 
 async function writeFlashPage(flash) {
     const kebab = getFlashDirectory(flash);
     const index = `${C.FLASH_DIRECTORY}/${kebab}/index.html`;
-    const act6 = flashData.findIndex(f => f.act.startsWith('Act 6'))
-    const side = (flashData.indexOf(flash) < act6) ? 1 : 2
+    const act6 = flashData.findIndex(f => f.act.startsWith('Act 6'));
+    const postCanon = flashData.findIndex(f => f.act.includes('Post Canon'));
+    const outsideCanon = postCanon + flashData.slice(postCanon).findIndex(f => !f.act.includes('Post Canon'));
+    const side = (
+        (flashData.indexOf(flash) < act6) ? 1 :
+        (flashData.indexOf(flash) <= outsideCanon) ? 2 :
+        0
+    );
     await writePage([C.FLASH_DIRECTORY, kebab], flash.name, fixWS`
         <body style="${getThemeString(flash.theme)}">
             <div id="sidebar">
@@ -1048,15 +1114,24 @@ async function writeFlashPage(flash) {
                 <dl>
                     ${flashData.filter(f => f.act8r8k).map(({ act, theme }) => fixWS`
                         ${act.startsWith('Act 1') && fixWS`
-                            <dt class="side ${side === 1 && 'current'}"><a href="${C.FLASH_DIRECTORY}/${getFlashDirectory(flashData.find(f => f.page && f.act.startsWith('Act 1')))}/index.html" style="--fg-color: #4ac925">Side 1 (Acts 1-5)</a></dt>
+                            <dt class="side ${side === 1 && 'current'}"><a href="${C.FLASH_DIRECTORY}/${getFlashDirectory(flashData.find(f => !f.act8r8k && f.act.startsWith('Act 1')))}/index.html" style="--fg-color: #4ac925">Side 1 (Acts 1-5)</a></dt>
                         `}
                         ${act.startsWith('Act 6 Act 1') && fixWS`
-                            <dt class="side ${side === 2 && 'current'}"><a href="${C.FLASH_DIRECTORY}/${getFlashDirectory(flashData.find(f => f.page && f.act.startsWith('Act 6')))}/index.html" style="--fg-color: #1076a2">Side 2 (Acts 6-7)</a></dt>
+                            <dt class="side ${side === 2 && 'current'}"><a href="${C.FLASH_DIRECTORY}/${getFlashDirectory(flashData.find(f => !f.act8r8k && f.act.startsWith('Act 6')))}/index.html" style="--fg-color: #1076a2">Side 2 (Acts 6-7)</a></dt>
+                        `}
+                        ${act.startsWith('Hiveswap') && fixWS`
+                            <dt class="side ${side === 0 && 'current'}"><a href="${C.FLASH_DIRECTORY}/${getFlashDirectory(flashData.find(f => !f.act8r8k && f.act.startsWith('Hiveswap')))}/index.html" style="--fg-color: #008282">Outside Canon (Misc. Games)</a></dt>
+                        `}
+                        ${(
+                            (flashData.findIndex(f => f.act === act) < act6) ? (side === 1) :
+                            ((flashData.findIndex(f => f.act === act) < outsideCanon) ? (side === 2) :
+                            true)
+                        ) && fixWS`
+                            <dt class="${act === flash.act ? 'current' : ''}"><a href="${C.FLASH_DIRECTORY}/${getFlashDirectory(flashData.find(f => !f.act8r8k && f.act === act))}/index.html" style="${getThemeString(theme)}">${act}</a></dt>
                         `}
-                        ${(flashData.findIndex(f => f.act === act) < act6 ? (side === 1) : (side === 2)) && `<dt class="${act === flash.act ? 'current' : ''}"><a href="${C.FLASH_DIRECTORY}/${getFlashDirectory(flashData.find(f => f.page && f.act === act))}/index.html" style="${getThemeString(theme)}">${act}</a></dt>`}
                         ${act === flash.act && fixWS`
                             <dd><ul>
-                                ${flashData.filter(f => f.page && f.act === act).map(f => fixWS`
+                                ${flashData.filter(f => !f.act8r8k && f.act === act).map(f => fixWS`
                                     <li class="${f === flash ? 'current' : ''}">
                                         <a href="${C.FLASH_DIRECTORY}/${getFlashDirectory(f)}/index.html" style="${getThemeString(f.theme)}">${f.name}</a>
                                     </li>
@@ -1070,16 +1145,28 @@ async function writeFlashPage(flash) {
                 <h1>${flash.name}</h1>
                 <a id="cover-art" href="${getFlashCover(flash)}"><img src="${getFlashCover(flash)}"></a>
                 <p>Released ${getDateString(flash)}.</p>
-                <p>Play on <a href="${getFlashLink(flash)}">Homestuck</a> (${isNaN(Number(flash.page)) ? 'secret page' : `page ${flash.page}`}).</p>
+                ${flash.page && `<p>Play on <a href="${getFlashLink(flash)}">Homestuck</a> (${isNaN(Number(flash.page)) ? 'secret page' : `page ${flash.page}`}).</p>`}
+                ${flash.contributors.length && fixWS`
+                    <p>Contributors:</p>
+                    <ul>
+                        ${flash.contributors.map(({ who, what }) => fixWS`
+                            <li>${artistNames.includes(who)
+                                ? `<a href="${C.ARTIST_DIRECTORY}/${C.getArtistDirectory(who)}/index.html">${who}</a>`
+                                : who
+                            } ${what && `(${getContributionString({what})})`}</li>
+                        `).join('\n')}
+                    </ul>
+                `}
                 <p>Tracks featured in <i>${flash.name.replace(/\.$/, '')}</i>:</p>
                 <ul>
                     ${flash.tracks.map(ref => {
                         const track = getLinkedTrack(ref);
                         const neighm = ref.match(/(.*?\S):/) || [ref, ref];
                         if (track) {
+                            const neeeighm = neighm[1].replace('$$$$', ':');
                             return fixWS`
                                 <li>
-                                    <a href="${C.TRACK_DIRECTORY}/${track.directory}/index.html" style="${getThemeString(track.album.theme)}">${neighm[1]}</a>
+                                    <a href="${C.TRACK_DIRECTORY}/${track.directory}/index.html" style="${getThemeString(track.album.theme)}">${neeeighm}</a>
                                     <span class="by">by ${getArtistString(track.artists)}</span>
                                 </li>
                             `;
@@ -1102,7 +1189,6 @@ async function writeFlashPage(flash) {
 
 function writeListingPages() {
     const allArtists = artistNames.slice().sort();
-    const albumsAndTracks = albumData.concat(allTracks)
 
     const getAlbumLI = (album, extraText = '') => fixWS`
         <li>
@@ -1114,7 +1200,7 @@ function writeListingPages() {
     const getArtistLI = artistName => fixWS`
         <li>
             <a href="${C.ARTIST_DIRECTORY}/${C.getArtistDirectory(artistName)}/index.html">${artistName}</a>
-            (${C.getArtistNumContributions(artistName, {allTracks, albumData})} <abbr title="contributions (to music & art)">c.</abbr>)
+            (${C.getArtistNumContributions(artistName, {allTracks, albumData, flashData})} <abbr title="contributions (to music, art, and flashes)">c.</abbr>)
         </li>
     `;
 
@@ -1139,7 +1225,7 @@ function writeListingPages() {
             .map(({ name }) => name)
             .map(getArtistLI)],
         [['artists', 'by-commentary'], `Artists - by Commentary`, allArtists
-            .map(name => ({name, commentary: C.getArtistCommentary(name, {albumsAndTracks}).length}))
+            .map(name => ({name, commentary: C.getArtistCommentary(name, {justEverythingMan}).length}))
             .filter(({ commentary }) => commentary > 0)
             .sort((a, b) => b.commentary - a.commentary)
             .map(({ name, commentary }) => fixWS`
@@ -1149,7 +1235,7 @@ function writeListingPages() {
                 </li>
             `)],
         [['artists', 'by-contribs'], `Artists - by Contributions`, allArtists
-            .map(name => ({name, contribs: C.getArtistNumContributions(name, {albumData, allTracks})}))
+            .map(name => ({name, contribs: C.getArtistNumContributions(name, {albumData, allTracks, flashData})}))
             .sort((a, b) => b.contribs - a.contribs)
             .map(({ name }) => name)
             .map(getArtistLI)],
@@ -1413,7 +1499,8 @@ function getThemeString({fg, bg, theme}) {
 function getFlashDirectory(flash) {
     // const kebab = getKebabCase(flash.name.replace('[S] ', ''));
     // return flash.page + (kebab ? '-' + kebab : '');
-    return '' + flash.page;
+    // return '' + flash.page;
+    return '' + flash.directory;
 }
 
 function getAlbumListTag(album) {
@@ -1484,7 +1571,7 @@ function getTrackCover(track) {
     }
 }
 function getFlashCover(flash) {
-    return `${C.FLASH_DIRECTORY}/${flash.page}.${flash.jiff === 'Yeah' ? 'gif' : 'png'}`;
+    return `${C.FLASH_DIRECTORY}/${getFlashDirectory(flash)}.${flash.jiff === 'Yeah' ? 'gif' : 'png'}`;
 }
 
 function getFlashLink(flash) {
@@ -1552,12 +1639,12 @@ async function main() {
     }
 
     allTracks = C.getAllTracks(albumData);
-    artistNames = C.getArtistNames(albumData);
+    artistNames = C.getArtistNames(albumData, flashData);
     artistNames.sort((a, b) => a.toLowerCase() < b.toLowerCase() ? -1 : a.toLowerCase() > b.toLowerCase() ? 1 : 0);
 
     officialAlbumData = albumData.filter(album => !album.isFanon);
     fandomAlbumData = albumData.filter(album => album.isFanon);
-    tracksAndAlbums = C.sortByDate(allTracks.concat(albumData));
+    justEverythingMan = C.sortByDate(allTracks.concat(albumData, flashData));
 
     {
         const directories = [];