initialization

This commit is contained in:
terminallesbian 2026-02-15 21:39:13 -06:00
commit cc03aeab0f
166 changed files with 2278 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
hidden

21
algorithm.md Normal file
View file

@ -0,0 +1,21 @@
# The All-seeing Algorithm
---
*[status: seed](?metadata)*
### intro
- Spotify rewind/recommendation fears
- History of the algorithm, from my perspective
- YouTube algorithm pandering
- TikTok FYP personalization
- Spotify recommendations/daylist
### Surveillance state
- Adservices
- your phone is listening to you
---
[last tended to: 11/28/2025
<br>
planted: 11/28/2025](?metadata)

84
architecture.md Normal file
View file

@ -0,0 +1,84 @@
{{{
"title": "Architecture",
"last_tended_to": "1/15/2025",
"planted": "11/26/2025",
"status": "sprouted"
}}}
The styling and functionality of this page is inspired by (stolen from) [WikiWikiWeb](https://wiki.c2.com). The corkboard-esque styling with "receipt pages" are the most obvious aspect, but not the only one. WikiWikiWeb also utilizes a custom markup language to write and edit pages, then translates that on the client-side to HTML which is added directly to the DOM. I do something similar using Markdown backing files (with minor preprocessing) translated with [marked.js](https://marked.js.org/).
I tried to build this website to be as simple as possible. This has two main focuses:
1. I want to be able to write simple Javascript without any extensions. No NPM, no Typescript, no compilation.
2. I want to be able to write my pages and immediately see the results. I shouldn't need to kick off bulky static site generation before making a page accessible.
Both of these goals aim to minimize the friction of creating as much as possible. I'm not a frequent writer and I don't have much time, so I'd like to remove all barriers that could prevent me from working on this. Also I hate the web development ecosystem.
---
## Corkboards & receipts
I'm not sure what else to call this style of overlaid, thin pages placed on top of links. The thin-and-tall articles remind me of receipts and the fact that they just end up strewn about (monitor space providing) feels a lot like pinning things to a corkboard.
It's a relatively simple effect to achieve--simply interrupt the standard onClick handler for internal links and parse it for the page to request. Once you've received the file, process it into HTML to be added to the DOM in a styled div. They're placed with the top left corner where the mouse position was, clamped so that it doesn't go off the screen for better usability on small devices.
---
## Formatting
This is one of the more complicated things going on. I do two main formatting steps: front matter and page imports. There's also a quick step that adds the visitor counts to each page.
### Front Matter (Kinda)
Front matter is a way of annotating a markdown document with additional data that will not be displayed. It's typically done in YAML and there are plenty of NPM packages to handle it, but I don't need a missile for this molehill. I decided to stick with built in Javascript JSON parsing to gather the data and store it at the beginning of each file with an additional two pairs of outer braces:
```
{{{ "front": "matter" }}}
```
This data is parsed and stripped before translating the markdown to HTML. I use it to generate the title and [metadata](?metadata), as well as set a few display settings.
### Inlining pages
For my [Twitter archive](?valeradhd) I wanted standalone files so that I could reuse/organize my tweets as I see fit. If I were to stick to keeping everything standalone, this would've led to [link-cities](https://www.youtube.com/watch?v=sZLVjCMStQw) full of [tiny standalone tweet pages](?twitter__tweets__11_13_2020), which didn't feel accessible and wasn't fun to navigate. Instead, I decided to add a way to "inline" pages--putting the link into the Markdown and replacing it with a copy of the linked page. My preprocessing step looks for links formatted as:
```
[[[pagename]]]
```
then replaces them with the content of the page in the preprocessing step. This is done synchronously for the first 2 inlined pages, but to prevent slowing down the loading of pages with more inlining, the rest of the pages are replaced with placeholders to be loaded asynchronously.
### Visit counts (footsteps)
You may have noticed the visit counts that now appear at the bottom of each page. These are linked to the next topic, but are related to page formatting so worth mentioning here. After the entire page is loaded and preprocessed I request a file containing the corresponding per-page counter and manually add it to the HTML for the page--you'll hopefully never see it, but if I mess up and can't track the number of visits on a page it'll say that the page has been visited "an unknown number of times".
---
## Interactivity
This is the one part of my website which I think strays further from my [K.I.S.S](https://wiki.c2.com/?KeepItSimpleStupid) mindset. Before adding my page to Neocities, I wanted to add a guestbook. Many "Neocitizens" do this by using a third party guestbook service. This might've been a better idea (captcha, standardization, spam protection), but I feel like it goes against two things:
1. I'm trying to be part of a more decentralized internet
2. I like to program
So I decided to build my own backend webserver. I also wanted to keep with the files-first organization of my other setups--if all my dynamic applications die, I still want my content to be in easily interpretable files to recover later. Files are also convenient because if something goes wrong, I can just delete them, edit them, or disable access to them altogether.
The webserver is incredibly simple. I built it in Rust with [Warp](https://github.com/seanmonstar/warp)--not for any particular architectural or opinionated reason, but just because that's the combination I felt I would have fun working with. It's incredibly barebones--it literally exposes 2 HTTP POST request endpoints which take the absolute minimum amount of data. I did NOT want to use JSON again, I get enough of that at my job.
### Signing the Guestbook
The first of the two endpoints requires the request body to be the content of the "signature". It accepts the request and does the following:
1. Figures out the time of the month. It's nice to have an idea when someone interacted with my page, but I don't want to feel like I'm snooping on your internet history/habits. Sometimes marking a comment with the exact timestamp feels like I'm being snitched on--and I don't want to contribute to the Panopticon of the internet. Therefore, I decided that I'd *only* figure out the date that a signature was made--and to add some character, I decided to round the date into where in the month it is (early, mid, or late). This is the header of each signature.
2. Adds a line break and the time of month to the bottom signatures file. I decided to make the guestbook a single file so that it's easy to maintain and only requires a single inline embed to display. This kept me from having to write any complicated dynamic loading code to load a bunch of signatures to the guestbook page.
3. Adds the content of the signature to the guestbook file.
That's it. The most complicated part is the time of month calculation. Other than that, it's just a complicated "append to file" routine.
### Stepping through the Garden
I was feeling a little bit like I was shouting into the void when I was first working on this website. I was annoying all of my friends and family about it constantly, and a few of them *were checking it* (and consistently, thank you!!) but I never got to see that. The site felt lonely. When I added the ability to do some dynamic elements to the website, I decided I'd also put in some work to keep track of how many visitors each page gets. I don't bother (or want to bother) with tracking *who* visits a page--see above on the "internet panopticon". Therefore, I exposed the second endpoint which literally does 2 things:
1. Looks at the URL requested
2. Finds (or creates) the file associated with that URL and increases the counter inside of it.
Despite how simple it is, it works really well. I store all of the "footstep" files in a single directory and can read them back whenever I want to display how many people have visited a page. I'm quite happy with it.

25
cyberspace.md Normal file
View file

@ -0,0 +1,25 @@
{{{
"title": "Borders of Cyberspace",
"planted": "1/16/2026",
"status": "seedling"
}}}
I've recently found myself spending a lot of time curating the space I exist in. I recently moved across the country into my first solo apartment, so I've had a lot of work to do to build a nest for myself. Alongside fleshing out my *physical* space, I've also begun to do some amateur "homelab" style projects--setting up a craigslist-sourced desktop as a server and an old laptop as a media center. I've also been putting work into configuring these to work together with my main PC smoothly over a customized network. It's probably safe to say that I've spent as much time on my "cyberspace" in the past few months as I have on my physical space.
In Sarah Davis Baker's [The Internet Used to be a Place](https://youtu.be/oYlcUbLAFmw) she discusses how the boundaries we built around computers, and by extension the internet, gave the early web the feeling of a physical *location*--one you could shut the door on. With the advent of internet-connected mobile phones, the modern web is always present. Even if you abstain, leave your phone at home, disable data, or disconnect in some other way, the internet is in the pockets of everyone around you. I'm less interested in discussing that now--instead, I'd like to dive into the feelings of building my virtual space in tandem with the physical.
I'll occasionally tour my space while on a video call with someone--distant friends, family--highlighting what I've paid special attention to (and conveniently keeping what I haven't out of frame). Whenever I pass over my TV or desk, I get an urge to describe everything I've set up and how it all works together, just like I'd zoom in on paintings I've hung or show off my kitchen. This usually isn't because the other person would be especially interested. My mind has just picked up and categorized my virtual spaces as an extension of my apartment.
Humans are wired for tool use. I'm always amazed at how smoothly my body adapts to driving a car, viewing its dimensions as extensions of my own. I can *feel* where the wheels of the car should be, how close I'll be trying to merge into another lane. I think my computer setup has entrenched itself into the proprioception I feel for my apartment. I can visualize, no *feel* the connections between my computers as I walk around. The internet used to be a place, and now it's everywhere. This doesn't give me the same anxiety that simply carrying my phone--being constantly accessible--does. In my apartment, I've curated where the boundaries are and aren't. With my phone, I don't get the same luxury.
---
As a postscript, VR has an interesting effect on how the internet feels. I tried to set up my original Oculus Quest a few months ago after a few years of not using it only to find Facebook had deleted my original account and wouldn't let me run any of my *locally downloaded* games without logging into a new one. I ended up having to factory reset and redownload my games onto a new account. Interestingly, this didn't feel like resetting a password or redownloading Steam games. I felt like part of my physical reality had been barred from me, and I had to rebuild it in a new place, with new restrictions.
Maybe I'm insane, maybe I'm mythologizing my experience, but I thought it was worth writing up.
---
Cyberspace is the psychic superset of the matrix -[Netiquette by Virginia Shea](http://www.albion.com/netiquette/book/0963702513p15.html)
*this isn't the actual quote, but how it was quoted to me by a friend. Check the terminology section for the real quote/context*

24
enjoyed.md Normal file
View file

@ -0,0 +1,24 @@
{{{
"title": "Things I've enjoyed recently",
"last_tended_to": "2/6/2026",
"planted": "1/13/2026",
"status": "sprout"
}}}
*I'm trying to find a good way to catalogue the disorganized set of things I've been enjoying lately. This could be anything from a post, a video, a movie, or just a moment I enjoyed. These are ordered by recency--I try to write comments as to why I enjoyed them to help me, future me, and maybe you understand. These aren't reviews.*
- [The colonization of confidence](https://sightlessscribbles.com/the-colonization-of-confidence/) is exactly the kind of story it uplifts throughout the story -- raw, imperfect at times, but genuine. I nearly shed a few tears in it's 10 minute narrative.
- [The Woman in the Park](https://rainstormsinjuly.co/Short/thewomaninthepark) describes the sanctity of a quiet morning commute. It reminds me of my own morning bus rides, which I protect aggressively. Despite them being twice as long as a drive would be, my bus commute gives me time to prepare for the day and relax after it. I love the description of the "morning almost-meetings". It mirrors the connection I have with my fellow passengers--I've never talked to most them, but I see them more often than many of my friends.
- Interdependence: I had a bad day today, objectively. I was late to work, shoved a door into my officemate, racked up a huge charge on accident, nearly cried in front of my boss, had my grocery bag split on me, and couldn't find my bus pass getting on the bus. I still feel happy at the end of the day--I thankfully have a wonderful community around me who helped out. My coworker assured me the charge wasn't an issue, my boss made sure I was OK, someone helped me with my groceries, and the bus driver let me on without paying. I can't do it alone, but I don't need to.
- [brin.neocities.org](https://brin.neocities.org/) I love the style on this page! I'm putting it here to save for later--the ASCII tabs are so neat. *Later: the ascii tabs were the hook that got me, but the entire site is so much cooler. They've got an entire interactive portfolio in a little game--completely redefining my understanding of a "static neocities site". I guess the only thing that needs to be static is the filesystem.
- [stop postponing your life.](https://www.youtube.com/watch?v=9CdbolZvc1I) mirrors a lot of my current feelings about creating things. It focuses a lot on not waiting for the perfect time to *start*, but I think it's equally important to not pursue perfection before *continuing* as well. I've been able to tap into my creative urges recently--moreso than I have for the last 3 or 4 years--and I think it's because I've been thriving off of imperfection. I'll have to write more about this later.
- *Predestination* (2014): Transgender matrix inception fanfiction.
- ["creating a digital garden to end doomscrolling"](https://www.youtube.com/watch?v=0tY7Z53QJo8) sounds like every other youtube video on self improvement with the indie web--it's not. I'm not even halfway through this video and I had to pause to write this because I'm worried I'd forget--or there'd be something *even better* to write. This video is less about what a digital garden is and more of the mindset behind it. It pushes back on the first-level idea of "consume more than you create" by countering with "listen more than you speak". Mindful listening is the path to **consumption that makes creation inevitable**.
- [Car Alarm](https://www.youtube.com/watch?v=jcutNFPwXPE) and it's sibling piece [Sirens](https://www.youtube.com/watch?v=UPfE3Of_tso). I fucking love the sound of the Khaen. These bring me so much calm (something about urban soundscapes). Pairs well with the calm before the storm.
- [F**k AI...Please do it yourself](https://www.youtube.com/watch?v=TSA8RTFdJgY) is a fun little video of "kids going around doing interviews" (as they described it). I've been watching a lot of "self-improvement" videos about reconnecting with creation and breaking free of algorithmic content consuming, so I thought this was going to be a video essay on why doing things yourself is better than doing them with AI. Instead, I found a charming video anchored deeply in real community--using graffiti and a vinyl record shop as the entrypoint. Worth the watch.
- A light dusting of snow on a black outfit. I bought a heavy coat a few months ago for my first winter in Wisconsin and it's been paying dividends. I love how the snow sticks to it but doesn't melt--it makes me feel like those Dutch sailors in Frankenstein with their beards frosted over.
- Footsteps of someone wearing pointy-toed shoes in the snow. I saw these while walking home--they reminded me of my mom saying "you could kill a cockroach in a corner with those" about some boots I thrifted. It's so funny how connected you can feel to someone who you'll never see purely by viewing their tiny impact on the world.
- [Netiquette by Virginia Shea](http://www.albion.com/netiquette/book/TOC0963702513.html). I love any artifact of the old web--this one was mentioned to me by a friend on the bus. Source of the ""quote"" at the bottom of [Borders of Cyberspace](?cyberspace)
- Making eye contact with people on public transit when weird things happen. Whether it's friends or strangers, that little bit of community is one of my most cherished part of being on public transit over being alone in a car. *This was brought on by an unusually loud "stand behind the yellow line" announcement on the bus that caused me and my friend Sylvie to mime our surprise to eachother*
- [blanketfort](https://blanketfort.neocities.org/): I read this one on the bus home today. I liked digging deeper into the author's blog/personal page--there's three layers! The blog's style of writing inspired me to make this page.
- [mikeyg.xyz](mikeyg.neocities.com) I found this one last night when I uploaded my website to Neocities. The style is really cool--similar to mine (monochrome), but much more artistic and chaotic. The photography is great--the urbex is super cool, but I actually found the store photos to be my favorite. Something about how invisible the subjects are to me in real life (through a conscious effort to tune them out) makes the photos seem more interesting. It feels like a historical record of something current.

20
finishing.md Normal file
View file

@ -0,0 +1,20 @@
{{{
"title": "Completing things (or not)",
"status": "seedling",
"planted": "1/27/2026"
}}}
I've recently been on the strongest creative kick I've had in years. I've been writing on this website, working on my apartment, and learning 3D printing, CAD, and microelectronics. There are numerous factors in my life to contribute to the "why now" of it all, but I'd like to think at least a small part of it is that I've killed my perfectionism.
I was recently showed my friend this website. We'd already been talking about a 3D printing project I had been messing with, and she commented how I'm "good at finishing things" (I assume she meant in contrast to her). As someone with ADHD and a long trail of unfinished projects from throughout the years, this was a foreign compliment to me--especially because I don't consider many of the things I'm working on currently to be finished. I think it comes down to a difference in perspective.
I recently watched [stop postponing your life](https://www.youtube.com/watch?v=9CdbolZvc1I), a video by an essayist I'm growing to love about "not waiting for the perfect moment" to start something. I've been integrating this into my life a lot recently. This website started not because I'd finally figured out what I wanted to write, nor the perfect way to create it, but because I was tired of *not having done it*. The first draft of this website had two markdown documents testing different styling features and links. I don't think I wrote on it for a week--but I'd started. I'd created something to build off of.
Though I don't think starting is the only issue at play here. There's a lot that can go wrong once you're working on a project, and a lot that has gone wrong on my past projects. A few of my past patterns that I'm trying to learn from:
- Daydreaming about parts of the project before you're ready to do them. That killer art style for the game you haven't made a character controller for? That perfect architecture for the website you haven't put down a line of code for? I find myself planning projects 8 steps in advance, without having completed the first 4. This makes the things you're doing in the moment feel flat because *they're nothing like what you're planning*. Additionally, planning at such a high level obscures the intrinsic difficulty of putting anything into practice.
- Planning for "the big release"--I used to make games imagining the moment I'd be able to release them, fully formed, to much acclaim. This is obviously a bad idea, and gets into my next point. There shouldn't be a designated "completion point" on most projects--it's an achillean race (the last 10% always takes longer than the first 90).
- Being afraid to let people see you fail. This goes into the last one--part of chasing that "complete" marker is because you're worried others will see how incomplete things are currently. In reality, seeing something incomplete just illustrates how human the author is--and that, to me, is human connection. I love seeing pages under construction on Neocities. I love finding half-formed thoughts. I love seeing someone's process.
This page tries to be antithetical to all of those issues. While I can't stop myself from daydreaming about that perfect architecture, I do nip those ideas in the bud when they start taking time from other things. I published this website as a seedling, and keep adding to it despite it not being perfect. The key to finishing things is knowing you'll never actually finish them--even if you have to leave them behind.

26
garden_path.md Normal file
View file

@ -0,0 +1,26 @@
{{{
"title": "Garden Path",
"planted": "11/24/2025",
"last_tended_to": "1/27/2026",
"status": "sprout"
}}}
Welcome in! Thank you for taking the time to visit. My garden is very much in the early stages, but I hope to be able to build it into an enjoyable space to write for and spend time in. This page is the central path to explore from. If you're interested in how this website came to be, check out:
- [Inspiration](?inspiration)
- [Architecture](?architecture)
- [Recent Updates](?updates)
If you liked how I wrote in those pages or want to click more links, check out my writing! I'm working on writing down more of my thoughts on this website, so this list will hopefully grow.
- [Completing things (or not)](?finishing)
- [A few scattered thoughts](?scatteredthoughts)
- [Borders of Cyberspace](?cyberspace)
I've also decided to make this website a place to archive a lot of my older work. Currently I've [repotted](?repotting) an old Twitter I used fairly extensively to document some gamedev projects I did a few years ago. If you're looking for flashy GIFs and terrible tweets, this is the place!
- [Gamedev Twitter Archive](?valeradhd)
If you enjoyed any of what I've done here or just like to put your name places, check out:
- [my guestbook!](?guestbook)
- [me!](?webmiss)

53
guestbook.md Normal file
View file

@ -0,0 +1,53 @@
{{{
"title": "Guestbook",
"status": "growing!",
"planted": "1/6/2026",
"last_tended_to": "1/10/2026",
"allow_inline": "true"
}}}
### Thanks for visiting my garden! Here's my guestbook:
<div class="signatures" style="position: relative;" id="signatures">
[[hidden__signatures]]
</div>
I'd love to get to know you too.
<label for="entry">If you're comfortable, go ahead and sign!</label>
Feel free to add whatever you want to share:
* who you are
* where you're reading from
* what time is it where you are?
* stuff you'd like to show me
* what you enjoyed
* what you hated >:(
<textarea id="entry" class="guestbook" maxlength=500></textarea>
<button id="sign" style="margin: 0 auto; width: 50%; display: table" onclick="
let signature = document.getElementById('entry').value;
if(signature.length == 0) { return; }
fetch('loam/sign', { method: 'post', body: signature}).then(() => {
console.log(signature);
const placeholder = document.getElementById('signatures');
let marked = import(`https://cdn.jsdelivr.net/npm/marked/lib/marked.esm.js`).then((mod)=> {
let marked = mod.marked
fetch('hidden/signatures.md')
.then((response) => {
if(!response.ok) {
return 'Unable to get signatures :('
}
return response.text();
})
.then((md) => {
placeholder.innerHTML = marked.parse(md);
// console.log('reloaded placeholder!')
})
});
});
const btn = document.getElementById('sign');
btn.disabled = true;
btn.innerHTML = 'thanks!'
">Sign</button>

15
home_page.md Normal file
View file

@ -0,0 +1,15 @@
{{{
"title": "Gateway",
"last_tended_to": "1/15/2026",
"planted": "11/24/2025"
}}}
Hi! You've found yourself at the entrance to my "digital garden". This is (will be) the place for mostly-unfiltered ideas, writings, and projects. I'm trying to make it as easy as possible for me to create, so expect bugs, weeds, and thorns!
By entering, you agree to:
- non-judgement
- enjoy yourself!
- not fuck my shit up (please!)
# [Continue to the garden](?garden_path)

16
hyperfixations.md Normal file
View file

@ -0,0 +1,16 @@
{{{
"title": "Hyperfixations",
"status": "seedling",
"planted": "2/9/2026"
}}}
Hyperfixations are one of the more counterintuitive parts of having autism. In a world where the end justifies the means, they're a godlike ability to focus on something most would find boring for hours at a time. A lot of my best work is the result of hyperfixations. Even from an external point of view, seeing someone hyperfixate on something is impressive -- in a matter of days or weeks, they can go from not knowing the basics to speaking like a professional. I think it's enjoyable too, in a way. It's nice to have something to focus on -- kills the boredom, prevents the scrolling.
Hyperfixations, in my experience, represent something different: an inescapable thought-sink that gets in the way of normal human function. I think that other autistic people might relate to this -- forgetting to eat because you've been working on something for 12 hours, physically having to pull yourself out of the magnetic field of the task, not being able to talk about anything else for weeks on end. I find myself not wanting to do anything else; just wanting to spend more time focusing on whatever has caught my fancy. This is more than "oh I forgot to do the dishes" or even "I'm not in touch with my body". I find myself not wanting to go outside, hang out with my friends, talk to anyone (unless it's about my fixation). I lose the ability to hold a regular sleep schedule -- it's hard to get to sleep when your mind won't stop going 90mph about how you're going to do *the next big thing*.
I used to enjoy them, seek after them. When you don't have anything else to do, a hyperfixation is the perfect escape. The chance to be "productive". When you don't need to keep a sleep schedule, don't have external commitments, don't have deadlines, it's a good way to stop from going insane.
I'm writing what is quickly turning into a vent post because I just spent the entirety of my weekend on my latest hyperfixation: the [Planet Computers Cosmo Communicator](https://www3.planetcom.co.uk/cosmo-communicator). I'm writing on one now, and it's quite nice. However, this thing has been the only thing I've thought about for the past week. I spent all weekend repeatedly setting up and attempting to upgrade the Linux distribution used on it. Monday morning, after all of that work, I spent my time trying to fix the latest issue (without success). If the end justifies the means, then I've learned a ton about Linux and Android and made plenty of great progress on getting this thing to work to my liking. On the other hand, I feel hollow. I was barely a human -- I was happy when plans were delayed, had to force myself to go out with friends, barely got my laundry done (and left all of my other tasks to languish).
I'm not sure what the conclusion of this page should be. This is one of the roughest things I've written -- I'm debating not posting it at all. I'm going to, because this garden has thorns. We'll see where it ends up.

10
index.html Normal file
View file

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
</head>
<body id="base"></body>
<script src="script.js" type="module"></script>
</html>

24
inspiration.md Normal file
View file

@ -0,0 +1,24 @@
{{{
"title": "Inspiration",
"last_tended_to": "1/15/2026",
"planted": "11/24/2025",
"status": "seedling"
}}}
### Digital Gardens
The content style of this page was inspired by the idea of a **digital garden**, or a personal space to share less-complete ideas that wouldn't be refined enough for a blog but deserve more ~attention~ focus? than what would be expected of a Twitter post. I'll also be trimming and pruning things from time to time, keeping this site as a living document.
I learned about the idea of a digital garden from Maggie Appleton's [Ethos of a Digital Garden](https://maggieappleton.com/garden-history).
### Friends
This site wouldn't exist if I wasn't so envious of how cool my friends are.
- Cassie Candles [(cassiecandles.net)](https://cassiecandles.net)
- pogmommy [(pogmom.me)](https://pogmom.me)
Both of these websites are *almost* as cool as the people behind them (check them out!), and segue into the next inspiration
### The new-old web
While I didn't get to experience "the old web" first-hand, I always enjoy finding remnants of it. Places like GeoCities had so much personality and charm which hardly exists on the web of today. This site was also directly inspired by [WikiWikiWeb](https://wiki.c2.com).

BIN
media/10_11_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 KiB

BIN
media/10_18_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

BIN
media/10_24_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 690 KiB

BIN
media/10_24_2020_2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

BIN
media/10_28_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

BIN
media/10_31_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 MiB

BIN
media/10_31_2020_2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 KiB

BIN
media/10_31_2020_3.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
media/11_13_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

BIN
media/11_13_2020.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
media/11_15_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

BIN
media/11_17_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

BIN
media/11_20_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 KiB

BIN
media/11_21_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
media/11_22_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

BIN
media/11_26_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
media/11_26_2020_2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

BIN
media/11_26_2020_3.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 664 KiB

BIN
media/11_27_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

BIN
media/11_28_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

BIN
media/11_2_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 652 KiB

BIN
media/11_2_2020_2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 685 KiB

BIN
media/11_3_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

BIN
media/11_5_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

BIN
media/11_6_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 KiB

BIN
media/11_7_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 966 KiB

BIN
media/11_7_2020_2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

BIN
media/11_7_2020_3.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 KiB

BIN
media/11_8_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 805 KiB

BIN
media/12_11_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

BIN
media/12_11_2020_2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
media/12_12_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
media/12_13_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

BIN
media/12_18_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 KiB

BIN
media/12_1_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 560 KiB

BIN
media/12_20_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 626 KiB

BIN
media/12_29_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

BIN
media/12_2_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

BIN
media/12_31_2020_1.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 MiB

BIN
media/12_31_2020_2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 MiB

BIN
media/12_31_2020_3.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 MiB

BIN
media/12_3_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 716 KiB

BIN
media/12_4_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 866 KiB

BIN
media/12_5_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
media/12_6_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 551 KiB

BIN
media/12_6_2020_2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 MiB

BIN
media/12_6_2020_3.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 419 KiB

BIN
media/12_8_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 752 KiB

BIN
media/1_11_2021.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 KiB

BIN
media/1_11_2021_rec.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

BIN
media/1_16_2021.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 KiB

BIN
media/1_17_2021.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
media/1_27_2021.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 KiB

BIN
media/1bpp_0.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
media/2_7_2021.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

BIN
media/2_7_2021.mp4 Normal file

Binary file not shown.

BIN
media/5_27_2022.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 KiB

BIN
media/5_3_2021.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 809 KiB

BIN
media/6_19_2021.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 KiB

BIN
media/6_20_2021.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
media/9_16_2021.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

BIN
media/9_20_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

BIN
media/9_20_2020_2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
media/9_21_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 991 KiB

BIN
media/9_22_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

BIN
media/9_24_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

BIN
media/9_26_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

BIN
media/9_30_2020.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 675 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
media/banner.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
media/banner.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
media/orbitweet_000.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
media/quivermapper_000.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
media/tweetbang_005.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
media/tweetfov_2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

BIN
media/vectordoom_017.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

14
metadata.md Normal file
View file

@ -0,0 +1,14 @@
{{{
"title": "Page descriptors (Metadata)",
"status": "sprout",
"last_tended_to": "12/11/2025",
"planted": "11/28/2025"
}}}
To emphasize the living nature of the writing I'm putting here, I'm going to steal another trick from [Maggie Appleton](https://maggieappleton.com/garden-history) & other gardeners: page statuses
- 'seedling's are pages I've written (probably on the bus) but not edited.
- 'sprout's are pages that I've gone back to, edited, and clarified ideas.
- 'tree's are pages that I consider "complete" to my satisfaction.
- 'repotted'/'repotting' means the page content wasn't written for this site. See [repotting](?repotting)
I'll also be putting 'planted' and 'last tended to' dates at the bottom of each page to track when I first wrote down an idea and when I last made an edit.

15
opinionated_languages.md Normal file
View file

@ -0,0 +1,15 @@
# Opinionated Languages & High Learning Curves
---
*[status: seed](?metadata)*
I recently switched to daily driving NixOS for my home computers. I'd been using Ubuntu as my main operating system (still dual booted with Windows) for the past few years, and was starting to feel confident in my Linux chops. My main issue was that the underlying settings were a complete mystery to me--I'd configured them over years of troubleshooting and random installs, and didn't have a good grasp of what was going on behind the scenes.
Enter NixOS, an operating system that promises "reproducibility" as a main selling point. This was mildly interesting, but what really sold me was that at its core, NIXOS is built around a single configuration file--written in a simple functional language--where you declare any settings you need for your system. I managed to get it working in a VM without too much trouble, so I decided to do a basic installation on an old HP laptop I wasn't actively using at the time.
---
[last tended to: 11/28/2025
<br>
planted: 11/28/2025](?metadata)

11
repotting.md Normal file
View file

@ -0,0 +1,11 @@
{{{
"title": "Repotting",
"planted": "12/11/2025",
"status": "seedling"
}}}
Not everything on this page was originally written for it. A key example of that are my [tweets](?valeradhd), most of which I posted from 2020-2022. I like to put these writings here as well, but I feel like it's something slightly more intentional than standard *reposting*. I've decided to continue the garden metaphor with *repotting*, which alludes to the thought process behind it.
I downloaded all of my old tweets, but they're not in a format that makes it convenient to quickly transfer them to this site. The text is separate from the media, and the media is all compressed. Rather than try to automate this in some way (something which is very tempting just to solve a problem), I decided to approach it from a different angle. I like going through my old things--it reminds me of who I was, and the cool stuff I've done before. When [repotting](?repotting), I keep as much of the original content and format as I can--see my [twitter conversation](?twitter__tweets__12_30_31_2020) about a voxel engine I once made--while still transferring it to the style of this site. I'm going through and manually copying the text, searching through my old hard drives for the original images, and collecting them into one place. It's extremely satisfying. The *gardener's notes* are a way of sharing a part of that process--both my thoughts while doing it and the larger context of the media.
Maybe I'll eventually repot other things I've scattered around the internet. I'm not sure what, but I quite enjoy the process.

9
scatteredthoughts.md Normal file
View file

@ -0,0 +1,9 @@
{{{
"title": "A few scattered thoughts",
"status": "seedling",
"planted": "1/27/2026"
}}}
I was telling my mom about this website and my writings on it a few weeks ago. She brought up how my grandfather, who was a pastor, would gather his smaller thoughts--not big enough to do a whole sermon on--and collect them into a recurring series of sermons he would give every few months. He called these "A few scattered thoughts". I decided I wanted to incorporate that into my website in some way, as a way of honoring him. I've currently only got a single page of scattered thoughts, but I might create more categories. I've already found this one useful.
* [Things I've enjoyed recently](?enjoyed)

240
script.js Normal file
View file

@ -0,0 +1,240 @@
import { marked } from 'https://cdn.jsdelivr.net/npm/marked/lib/marked.esm.js'
const body = document.body
async function loadPage(x = 0, y = 0) {
const urlString = window.location.search;
let pageName = urlString.split('?')[1];
if(!pageName || !(/^[A-Za-z0-9_]+$/.test(pageName))) {
pageName = "home_page"
window.location.search = "?home_page"
window.history.pushState("home_page", "", window.location)
}
const text = await requestPage(pageName);
const steps = await stepThroughPage(pageName);
renderPage(pageName, text, steps, x, y);
}
async function stepThroughPage(pageName) {
const step = await fetch(`/loam/step/${pageName}.txt`, { method: 'post' });
if(!step.ok) { console.log("Unable to leave footprints here :("); }
const getSteps = await fetch(`/hidden/footsteps/${pageName}.txt`);
if(!getSteps.ok) { console.log("Unable to figure out how many steps are here :("); return "an unknown number of " }
return getSteps.text();
}
async function requestPage(pageName) {
const fileName = pageName.replaceAll("__", "/") + ".md";
const response = await fetch(fileName);
if(!response.ok) {
return "This page does not exist!"
}
return response.text();
}
async function preprocessMarkdown(markdown) {
// parse the initial {{{ frontmatter }}}
let frontmatter = null;
markdown = markdown.trimStart();
if (markdown.startsWith("{{{")) {
let begin = markdown.indexOf("{{{") + 2;
let end = markdown.indexOf("}}}") + 1;
// console.log(`begin: ${begin} end: ${end}`);
// console.log(markdown.slice(begin, end));
// parse frontmatter JSON
frontmatter = JSON.parse(markdown.slice(begin, end));
// remove frontmatter
markdown = markdown.slice(end + 2);
}
// use frontmatter to add page stylings
if (frontmatter) {
const title = frontmatter.title ? `# ${frontmatter.title}\n---\n\n` : "";
const status = frontmatter.status ? `*<a class="metadata" href="?metadata">status: ${frontmatter.status}</a>*\n\n---\n\n` : "";
let metadata = (frontmatter.nobreak ? "" : "\n---") + `\n\n*<a class="metadata" href="?metadata"><p>`;
if (frontmatter.last_tended_to) {
metadata += `last tended to: ${frontmatter.last_tended_to}`;
}
if (frontmatter.repotted) {
if(!metadata.endsWith("<p>")) { // not the first metadata item
metadata += "<br>";
}
metadata += `repotted: ${frontmatter.repotted}`;
}
if (frontmatter.planted) {
if(!metadata.endsWith("<p>")) { // not the first metadata item
metadata += "<br>";
}
metadata += `planted: ${frontmatter.planted}`;
}
metadata += "</p></a>*";
if (frontmatter.allow_inline) {
const matches = markdown.match(/\[\[.+\]\]/g);
let i = 0;
for(let match of matches) {
match = match.slice(2, -2);
if(i < 2) { // synchronously load the first few inlines
let subpage = await requestPage(`${match}`);
subpage = await preprocessMarkdown(subpage);
markdown = markdown.replace(`[[${match}]]`, subpage);
}
else { // replace the rest with placeholders to be loaded slowly
markdown = markdown.replace(`[[${match}]]`,
`<p id="placeholder-${match}"></p>`
)
requestPage(match)
.then((text) => preprocessMarkdown(text))
.then((md) => {
const placeholder = document.getElementById(`placeholder-${match}`);
placeholder.outerHTML = marked.parse(md);
});
}
i++;
}
}
markdown = title + status + markdown + metadata;
}
return markdown;
}
async function renderPage(title, markdown, steps, x = 0, y = 0) {
let clientWidth = window.innerWidth;
// make sure a page isn't wider than the screen
const pageWidth = Math.min(400, clientWidth - 20);
// make sure that small screens can still get the corkboard effect
if(clientWidth < pageWidth * 2) {
clientWidth = pageWidth * 2;
}
if(x + pageWidth + 20 > clientWidth) {
// offset the page by the amount it would've been pushed off the page.
x -= ((x + pageWidth + 20) - clientWidth) * 2;
}
x = Math.max(0, Math.min(x, clientWidth - pageWidth - 20))
let page = document.createElement("div");
page.id = title;
page.className = "page";
page.style = `width: ${pageWidth}px; left: ${x}px; top: ${y}px`;
markdown = await preprocessMarkdown(markdown);
if(steps) {
markdown += `<p>*this page has been passed through ${steps}`
markdown += steps === "1" ? " time" : " times"
markdown += "*<p>"
}
page.innerHTML = marked.parse(markdown);
body.appendChild(page);
}
// satisfies the following constraints for a container:
// 1. The container cannot be *outside the screen bounds*
// a. If this means resizing the container width, do so
// 2. The container must be underneath the mouse pointer (with the container top placed aligned with it)
// returns { x = <top left X value>, y = <top left y value>, width = <modified container width> }
function placeContainer(width, mouseX, mouseY) {
// TODO ( i got lazy )
}
async function renderImageDetail(source, width, x = 0, y = 0) {
let clientWidth = window.visualViewport.width;
if (width < 400) width = 400;
// make sure a page isn't wider than the screen
const pageWidth = Math.min(width, clientWidth - 20);
// start by putting the image in the center of the screen
let newX = window.visualViewport.offsetLeft + clientWidth / 2 - width / 2;
// make sure the mouse pointer is past the *left edge* of the image
if(x < newX) newX = x;
// make sure the mouse pointer is before the *right edge* of the image
if(newX + pageWidth < x) newX = x - pageWidth;
// make sure the page is not off screen either direction
if(newX < window.visualViewport.offsetLeft) newX = 0;
if(newX + pageWidth > window.visualViewport.offsetLeft + clientWidth) newX = clientWidth - pageWidth;
let page = document.createElement("div");
page.id = source;
page.className = "page";
page.style = `width: ${pageWidth}px; left: ${newX}px; top: ${y}px`;
let img = document.createElement("img");
page.appendChild(img);
img.src = source;
img.className = "imgDetail";
body.appendChild(page);
}
window.addEventListener('popstate', (event) => {
if(event.state) {
const name = event.state;
const matches = document.querySelectorAll(`#${name}`);
const keep = matches[matches.length - 1];
if(keep) {
while(keep.nextElementSibling) {
keep.nextElementSibling.remove();
}
} else { // no pages remaining, just reload the one requested.
loadPage();
}
}
});
window.addEventListener('click', (event) => {
// console.log(event.target.tagName);
if(event.target.tagName === "A") {
const url = event.target.href;
if(!url.includes('hotn.gay') || url.includes('mailto')) { return; }
event.preventDefault();
let page = url.split("?")[1]
if(page != window.history.state) window.history.pushState(page, "", url);
loadPage(event.pageX, event.pageY);
} else if(event.target.tagName === "IMG") {
if(event.target.className === "imgDetail") { event.target.parentElement.remove(); return; }
let src = event.target.src;
if(document.getElementById(src)) { document.getElementById(src).remove(); }
let width = event.target.naturalWidth + 20;
renderImageDetail(src, width, event.pageX, event.pageY);
} else {
let keep = event.target.closest('.page');
if(keep) {
window.history.pushState(keep.id, "", `?${keep.id}`)
while(keep.nextElementSibling) {
keep.nextElementSibling.remove();
}
}
}
})
loadPage();

75
style.css Normal file
View file

@ -0,0 +1,75 @@
* {
background-color: black;
color: #fff1e8;
border-color: #fff1e8;
font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
}
.page {
border-style: solid;
border-width: 1px;
margin: 10px;
position: absolute;
}
.code p, code {
border-style: solid;
border-width: 1px;
margin: 1em;
padding: .5em;
display: block;
font-family: mono;
word-wrap: break-word;
}
.signatures {
border-style: solid;
border-width: 1px;
margin: 1em;
padding: .5em;
}
.guestbook {
width: calc(100% - 2em);
margin: 0 auto;
display: table;
resize: none;
}
.imgDetail {
margin: 10px;
width: calc(100% - 20px);
}
hr {
width: 100%;
border-style: dashed;
}
h1, h2, h3, p {
margin: .5em;
}
h4 {
margin-left: 2em;
}
img {
width: 100%;
}
a {
color: #ff004d
}
a:visited {
color: #7E2553
}
.metadata {
color: #fff1e8
}
.metadata:visited {
color: #fff1e8
}

13
template.md Normal file
View file

@ -0,0 +1,13 @@
# Title
---
*[status: **?**](?metadata)*
CONTENT
---
[last tended to: **?**
<br>
planted: **?**](?metadata)

53
twitter/misc.md Normal file
View file

@ -0,0 +1,53 @@
{{{
"title": "Miscellaneous Tweets",
"last_tended_to": "1/4/2026",
"planted": "12/1/2025",
"allow_inline": "true",
"status": "repotted"
}}}
[[twitter__tweets__5_27_2022]]
---
[[twitter__tweets__1_11_2021]]
---
[[twitter__tweets__12_30_31_2020]]
---
[[twitter__tweets__12_1_2020]]
---
[[twitter__tweets__11_26_2020]]
---
[[twitter__tweets__11_27_2020]]
---
[[twitter__tweets__11_28_2020]]
---
[[twitter__tweets__11_15_2020]]
---
[[twitter__tweets__11_13_2020_2]]
---
[[twitter__tweets__11_6_2020]]
---
[[twitter__tweets__10_11_2020]]
---
[[twitter__tweets__9_26_2020]]

21
twitter/pukenukem.md Normal file
View file

@ -0,0 +1,21 @@
{{{
"title": "Puke Nukem 3D",
"last_tended_to": "1/4/2026",
"planted": "1/4/2025",
"allow_inline": "true",
"status": "repotted"
}}}
[[twitter__tweets__9_30_2020]]
---
[[twitter__tweets__10_31_2020]]
---
[[twitter__tweets__11_2_2020_2]]
---
[[twitter__tweets__12_6_2020_1]]

29
twitter/quiver.md Normal file
View file

@ -0,0 +1,29 @@
{{{
"title": "Quiver Engine",
"last_tended_to": "1/4/2026",
"planted": "1/4/2025",
"allow_inline": "true",
"status": "repotted"
}}}
[[twitter__tweets__9_20_2020]]
---
[[twitter__tweets__9_21_2020]]
---
[[twitter__tweets__9_22_2020]]
---
[[twitter__tweets__9_24_2020]]
---
[[twitter__tweets__10_18_2020]]

73
twitter/tweetcarts.md Normal file
View file

@ -0,0 +1,73 @@
{{{
"title": "Pico-8 Code Golf (TweetCarts)",
"last_tended_to": "1/4/2026",
"planted": "1/4/2025",
"allow_inline": "true",
"status": "repotted"
}}}
[[twitter__tweets__9_16_2021]]
---
[[twitter__tweets__6_20_2021]]
---
[[twitter__tweets__6_19_2021]]
---
[[twitter__tweets__11_26_2020_2]]
---
[[twitter__tweets__11_26_2020_3]]
---
[[twitter__tweets__11_22_2020]]
---
[[twitter__tweets__11_21_2020]]
---
[[twitter__tweets__11_20_2020]]
---
[[twitter__tweets__11_17_2020]]
---
[[twitter__tweets__11_13_2020]]
---
[[twitter__tweets__11_8_2020]]
---
[[twitter__tweets__11_7_2020]]
---
[[twitter__tweets__11_7_2020_2]]
---
[[twitter__tweets__11_5_2020]]
---
[[twitter__tweets__11_2_2020]]
---
[[twitter__tweets__10_28_2020]]
---
[[twitter__tweets__10_24_2020]]

Some files were not shown because too many files have changed in this diff Show more