commit cc03aeab0f75ae1f49a86768b68e3226b3037a4e Author: terminallesbian Date: Sun Feb 15 21:39:13 2026 -0600 initialization diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aea3c67 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +hidden \ No newline at end of file diff --git a/algorithm.md b/algorithm.md new file mode 100644 index 0000000..09a704b --- /dev/null +++ b/algorithm.md @@ -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 +
+planted: 11/28/2025](?metadata) diff --git a/architecture.md b/architecture.md new file mode 100644 index 0000000..984d650 --- /dev/null +++ b/architecture.md @@ -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. diff --git a/cyberspace.md b/cyberspace.md new file mode 100644 index 0000000..aa1d9ff --- /dev/null +++ b/cyberspace.md @@ -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* + diff --git a/enjoyed.md b/enjoyed.md new file mode 100644 index 0000000..0805e50 --- /dev/null +++ b/enjoyed.md @@ -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. \ No newline at end of file diff --git a/finishing.md b/finishing.md new file mode 100644 index 0000000..0ead2a4 --- /dev/null +++ b/finishing.md @@ -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. + diff --git a/garden_path.md b/garden_path.md new file mode 100644 index 0000000..eb5065e --- /dev/null +++ b/garden_path.md @@ -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) diff --git a/guestbook.md b/guestbook.md new file mode 100644 index 0000000..a7732b9 --- /dev/null +++ b/guestbook.md @@ -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: + +
+ +[[hidden__signatures]] + +
+ +I'd love to get to know you too. + + +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 >:( + + + diff --git a/home_page.md b/home_page.md new file mode 100644 index 0000000..38b934d --- /dev/null +++ b/home_page.md @@ -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) \ No newline at end of file diff --git a/hyperfixations.md b/hyperfixations.md new file mode 100644 index 0000000..d7b219c --- /dev/null +++ b/hyperfixations.md @@ -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. + diff --git a/index.html b/index.html new file mode 100644 index 0000000..281968b --- /dev/null +++ b/index.html @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/inspiration.md b/inspiration.md new file mode 100644 index 0000000..a6ff5e8 --- /dev/null +++ b/inspiration.md @@ -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). + diff --git a/media/10_11_2020.gif b/media/10_11_2020.gif new file mode 100644 index 0000000..2e75428 Binary files /dev/null and b/media/10_11_2020.gif differ diff --git a/media/10_18_2020.gif b/media/10_18_2020.gif new file mode 100644 index 0000000..c2e88ab Binary files /dev/null and b/media/10_18_2020.gif differ diff --git a/media/10_24_2020.gif b/media/10_24_2020.gif new file mode 100644 index 0000000..49f8483 Binary files /dev/null and b/media/10_24_2020.gif differ diff --git a/media/10_24_2020_2.gif b/media/10_24_2020_2.gif new file mode 100644 index 0000000..c3a5669 Binary files /dev/null and b/media/10_24_2020_2.gif differ diff --git a/media/10_28_2020.gif b/media/10_28_2020.gif new file mode 100644 index 0000000..aca7f88 Binary files /dev/null and b/media/10_28_2020.gif differ diff --git a/media/10_31_2020.gif b/media/10_31_2020.gif new file mode 100644 index 0000000..50ae372 Binary files /dev/null and b/media/10_31_2020.gif differ diff --git a/media/10_31_2020_2.gif b/media/10_31_2020_2.gif new file mode 100644 index 0000000..9124905 Binary files /dev/null and b/media/10_31_2020_2.gif differ diff --git a/media/10_31_2020_3.gif b/media/10_31_2020_3.gif new file mode 100644 index 0000000..03f09a1 Binary files /dev/null and b/media/10_31_2020_3.gif differ diff --git a/media/11_13_2020.gif b/media/11_13_2020.gif new file mode 100644 index 0000000..134d01f Binary files /dev/null and b/media/11_13_2020.gif differ diff --git a/media/11_13_2020.png b/media/11_13_2020.png new file mode 100644 index 0000000..27eaabc Binary files /dev/null and b/media/11_13_2020.png differ diff --git a/media/11_15_2020.gif b/media/11_15_2020.gif new file mode 100644 index 0000000..e031fd6 Binary files /dev/null and b/media/11_15_2020.gif differ diff --git a/media/11_17_2020.gif b/media/11_17_2020.gif new file mode 100644 index 0000000..19d8f73 Binary files /dev/null and b/media/11_17_2020.gif differ diff --git a/media/11_20_2020.gif b/media/11_20_2020.gif new file mode 100644 index 0000000..99ee302 Binary files /dev/null and b/media/11_20_2020.gif differ diff --git a/media/11_21_2020.gif b/media/11_21_2020.gif new file mode 100644 index 0000000..cb062c4 Binary files /dev/null and b/media/11_21_2020.gif differ diff --git a/media/11_22_2020.gif b/media/11_22_2020.gif new file mode 100644 index 0000000..d63d0ec Binary files /dev/null and b/media/11_22_2020.gif differ diff --git a/media/11_26_2020.gif b/media/11_26_2020.gif new file mode 100644 index 0000000..1474283 Binary files /dev/null and b/media/11_26_2020.gif differ diff --git a/media/11_26_2020_2.gif b/media/11_26_2020_2.gif new file mode 100644 index 0000000..e1f5c82 Binary files /dev/null and b/media/11_26_2020_2.gif differ diff --git a/media/11_26_2020_3.gif b/media/11_26_2020_3.gif new file mode 100644 index 0000000..3e7c447 Binary files /dev/null and b/media/11_26_2020_3.gif differ diff --git a/media/11_27_2020.gif b/media/11_27_2020.gif new file mode 100644 index 0000000..34849f6 Binary files /dev/null and b/media/11_27_2020.gif differ diff --git a/media/11_28_2020.gif b/media/11_28_2020.gif new file mode 100644 index 0000000..1d39c44 Binary files /dev/null and b/media/11_28_2020.gif differ diff --git a/media/11_2_2020.gif b/media/11_2_2020.gif new file mode 100644 index 0000000..886e872 Binary files /dev/null and b/media/11_2_2020.gif differ diff --git a/media/11_2_2020_2.gif b/media/11_2_2020_2.gif new file mode 100644 index 0000000..89754fa Binary files /dev/null and b/media/11_2_2020_2.gif differ diff --git a/media/11_3_2020.gif b/media/11_3_2020.gif new file mode 100644 index 0000000..5aed307 Binary files /dev/null and b/media/11_3_2020.gif differ diff --git a/media/11_5_2020.gif b/media/11_5_2020.gif new file mode 100644 index 0000000..bd8c371 Binary files /dev/null and b/media/11_5_2020.gif differ diff --git a/media/11_6_2020.gif b/media/11_6_2020.gif new file mode 100644 index 0000000..8bfa919 Binary files /dev/null and b/media/11_6_2020.gif differ diff --git a/media/11_7_2020.gif b/media/11_7_2020.gif new file mode 100644 index 0000000..8ab19a9 Binary files /dev/null and b/media/11_7_2020.gif differ diff --git a/media/11_7_2020_2.gif b/media/11_7_2020_2.gif new file mode 100644 index 0000000..cd9ed93 Binary files /dev/null and b/media/11_7_2020_2.gif differ diff --git a/media/11_7_2020_3.gif b/media/11_7_2020_3.gif new file mode 100644 index 0000000..6d09ef8 Binary files /dev/null and b/media/11_7_2020_3.gif differ diff --git a/media/11_8_2020.gif b/media/11_8_2020.gif new file mode 100644 index 0000000..82d9c97 Binary files /dev/null and b/media/11_8_2020.gif differ diff --git a/media/12_11_2020.gif b/media/12_11_2020.gif new file mode 100644 index 0000000..8116886 Binary files /dev/null and b/media/12_11_2020.gif differ diff --git a/media/12_11_2020_2.jpg b/media/12_11_2020_2.jpg new file mode 100644 index 0000000..67ea1d3 Binary files /dev/null and b/media/12_11_2020_2.jpg differ diff --git a/media/12_12_2020.gif b/media/12_12_2020.gif new file mode 100644 index 0000000..e58ae1a Binary files /dev/null and b/media/12_12_2020.gif differ diff --git a/media/12_13_2020.gif b/media/12_13_2020.gif new file mode 100644 index 0000000..98ca922 Binary files /dev/null and b/media/12_13_2020.gif differ diff --git a/media/12_18_2020.gif b/media/12_18_2020.gif new file mode 100644 index 0000000..48104a2 Binary files /dev/null and b/media/12_18_2020.gif differ diff --git a/media/12_1_2020.gif b/media/12_1_2020.gif new file mode 100644 index 0000000..6fa77f7 Binary files /dev/null and b/media/12_1_2020.gif differ diff --git a/media/12_20_2020.gif b/media/12_20_2020.gif new file mode 100644 index 0000000..786da66 Binary files /dev/null and b/media/12_20_2020.gif differ diff --git a/media/12_29_2020.gif b/media/12_29_2020.gif new file mode 100644 index 0000000..43e34be Binary files /dev/null and b/media/12_29_2020.gif differ diff --git a/media/12_2_2020.gif b/media/12_2_2020.gif new file mode 100644 index 0000000..ae24593 Binary files /dev/null and b/media/12_2_2020.gif differ diff --git a/media/12_31_2020_1.gif b/media/12_31_2020_1.gif new file mode 100644 index 0000000..8989755 Binary files /dev/null and b/media/12_31_2020_1.gif differ diff --git a/media/12_31_2020_2.gif b/media/12_31_2020_2.gif new file mode 100644 index 0000000..ed10235 Binary files /dev/null and b/media/12_31_2020_2.gif differ diff --git a/media/12_31_2020_3.gif b/media/12_31_2020_3.gif new file mode 100644 index 0000000..de7af40 Binary files /dev/null and b/media/12_31_2020_3.gif differ diff --git a/media/12_3_2020.gif b/media/12_3_2020.gif new file mode 100644 index 0000000..050aa87 Binary files /dev/null and b/media/12_3_2020.gif differ diff --git a/media/12_4_2020.gif b/media/12_4_2020.gif new file mode 100644 index 0000000..8486e91 Binary files /dev/null and b/media/12_4_2020.gif differ diff --git a/media/12_5_2020.gif b/media/12_5_2020.gif new file mode 100644 index 0000000..f6db529 Binary files /dev/null and b/media/12_5_2020.gif differ diff --git a/media/12_6_2020.gif b/media/12_6_2020.gif new file mode 100644 index 0000000..12096af Binary files /dev/null and b/media/12_6_2020.gif differ diff --git a/media/12_6_2020_2.gif b/media/12_6_2020_2.gif new file mode 100644 index 0000000..459ae46 Binary files /dev/null and b/media/12_6_2020_2.gif differ diff --git a/media/12_6_2020_3.gif b/media/12_6_2020_3.gif new file mode 100644 index 0000000..20551d8 Binary files /dev/null and b/media/12_6_2020_3.gif differ diff --git a/media/12_8_2020.gif b/media/12_8_2020.gif new file mode 100644 index 0000000..2a75f1f Binary files /dev/null and b/media/12_8_2020.gif differ diff --git a/media/1_11_2021.gif b/media/1_11_2021.gif new file mode 100644 index 0000000..98e0c16 Binary files /dev/null and b/media/1_11_2021.gif differ diff --git a/media/1_11_2021_rec.gif b/media/1_11_2021_rec.gif new file mode 100644 index 0000000..886e4c0 Binary files /dev/null and b/media/1_11_2021_rec.gif differ diff --git a/media/1_16_2021.gif b/media/1_16_2021.gif new file mode 100644 index 0000000..338545b Binary files /dev/null and b/media/1_16_2021.gif differ diff --git a/media/1_17_2021.gif b/media/1_17_2021.gif new file mode 100644 index 0000000..3dd731f Binary files /dev/null and b/media/1_17_2021.gif differ diff --git a/media/1_27_2021.gif b/media/1_27_2021.gif new file mode 100644 index 0000000..6bc2ec6 Binary files /dev/null and b/media/1_27_2021.gif differ diff --git a/media/1bpp_0.gif b/media/1bpp_0.gif new file mode 100644 index 0000000..897f57f Binary files /dev/null and b/media/1bpp_0.gif differ diff --git a/media/2_7_2021.gif b/media/2_7_2021.gif new file mode 100644 index 0000000..af53254 Binary files /dev/null and b/media/2_7_2021.gif differ diff --git a/media/2_7_2021.mp4 b/media/2_7_2021.mp4 new file mode 100644 index 0000000..e5596ed Binary files /dev/null and b/media/2_7_2021.mp4 differ diff --git a/media/5_27_2022.gif b/media/5_27_2022.gif new file mode 100644 index 0000000..69d32ff Binary files /dev/null and b/media/5_27_2022.gif differ diff --git a/media/5_3_2021.gif b/media/5_3_2021.gif new file mode 100644 index 0000000..76f65ce Binary files /dev/null and b/media/5_3_2021.gif differ diff --git a/media/6_19_2021.gif b/media/6_19_2021.gif new file mode 100644 index 0000000..6545764 Binary files /dev/null and b/media/6_19_2021.gif differ diff --git a/media/6_20_2021.gif b/media/6_20_2021.gif new file mode 100644 index 0000000..a486491 Binary files /dev/null and b/media/6_20_2021.gif differ diff --git a/media/9_16_2021.gif b/media/9_16_2021.gif new file mode 100644 index 0000000..48bba43 Binary files /dev/null and b/media/9_16_2021.gif differ diff --git a/media/9_20_2020.gif b/media/9_20_2020.gif new file mode 100644 index 0000000..5450eaf Binary files /dev/null and b/media/9_20_2020.gif differ diff --git a/media/9_20_2020_2.gif b/media/9_20_2020_2.gif new file mode 100644 index 0000000..3062513 Binary files /dev/null and b/media/9_20_2020_2.gif differ diff --git a/media/9_21_2020.gif b/media/9_21_2020.gif new file mode 100644 index 0000000..5799575 Binary files /dev/null and b/media/9_21_2020.gif differ diff --git a/media/9_22_2020.gif b/media/9_22_2020.gif new file mode 100644 index 0000000..81c3d7c Binary files /dev/null and b/media/9_22_2020.gif differ diff --git a/media/9_24_2020.gif b/media/9_24_2020.gif new file mode 100644 index 0000000..081f505 Binary files /dev/null and b/media/9_24_2020.gif differ diff --git a/media/9_26_2020.gif b/media/9_26_2020.gif new file mode 100644 index 0000000..571ff19 Binary files /dev/null and b/media/9_26_2020.gif differ diff --git a/media/9_30_2020.gif b/media/9_30_2020.gif new file mode 100644 index 0000000..d6a4135 Binary files /dev/null and b/media/9_30_2020.gif differ diff --git a/media/IMG_20260115_191222434.jpg b/media/IMG_20260115_191222434.jpg new file mode 100644 index 0000000..c1290d5 Binary files /dev/null and b/media/IMG_20260115_191222434.jpg differ diff --git a/media/IMG_20260126_172318499.jpg b/media/IMG_20260126_172318499.jpg new file mode 100644 index 0000000..51b6533 Binary files /dev/null and b/media/IMG_20260126_172318499.jpg differ diff --git a/media/banner.png b/media/banner.png new file mode 100644 index 0000000..2e86e17 Binary files /dev/null and b/media/banner.png differ diff --git a/media/banner.webp b/media/banner.webp new file mode 100644 index 0000000..fdc6068 Binary files /dev/null and b/media/banner.webp differ diff --git a/media/orbitweet_000.png b/media/orbitweet_000.png new file mode 100644 index 0000000..fa79448 Binary files /dev/null and b/media/orbitweet_000.png differ diff --git a/media/quivermapper_000.png b/media/quivermapper_000.png new file mode 100644 index 0000000..a7a3a6f Binary files /dev/null and b/media/quivermapper_000.png differ diff --git a/media/tweetbang_005.png b/media/tweetbang_005.png new file mode 100644 index 0000000..a79e103 Binary files /dev/null and b/media/tweetbang_005.png differ diff --git a/media/tweetfov_2.gif b/media/tweetfov_2.gif new file mode 100644 index 0000000..2a46719 Binary files /dev/null and b/media/tweetfov_2.gif differ diff --git a/media/vectordoom_017.png b/media/vectordoom_017.png new file mode 100644 index 0000000..73b2c86 Binary files /dev/null and b/media/vectordoom_017.png differ diff --git a/metadata.md b/metadata.md new file mode 100644 index 0000000..a4b96c1 --- /dev/null +++ b/metadata.md @@ -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. diff --git a/opinionated_languages.md b/opinionated_languages.md new file mode 100644 index 0000000..db4924f --- /dev/null +++ b/opinionated_languages.md @@ -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 +
+planted: 11/28/2025](?metadata) diff --git a/repotting.md b/repotting.md new file mode 100644 index 0000000..e41e854 --- /dev/null +++ b/repotting.md @@ -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. diff --git a/scatteredthoughts.md b/scatteredthoughts.md new file mode 100644 index 0000000..a7f5708 --- /dev/null +++ b/scatteredthoughts.md @@ -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) \ No newline at end of file diff --git a/script.js b/script.js new file mode 100644 index 0000000..307458f --- /dev/null +++ b/script.js @@ -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 ? `*status: ${frontmatter.status}*\n\n---\n\n` : ""; + + let metadata = (frontmatter.nobreak ? "" : "\n---") + `\n\n*

`; + if (frontmatter.last_tended_to) { + metadata += `last tended to: ${frontmatter.last_tended_to}`; + } + + if (frontmatter.repotted) { + if(!metadata.endsWith("

")) { // not the first metadata item + metadata += "
"; + } + metadata += `repotted: ${frontmatter.repotted}`; + } + if (frontmatter.planted) { + if(!metadata.endsWith("

")) { // not the first metadata item + metadata += "
"; + } + metadata += `planted: ${frontmatter.planted}`; + } + metadata += "

*"; + + 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}]]`, + `

` + ) + 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 += `

*this page has been passed through ${steps}` + markdown += steps === "1" ? " time" : " times" + markdown += "*

" + } + + 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 = , y = , 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(); \ No newline at end of file diff --git a/style.css b/style.css new file mode 100644 index 0000000..ee1f2ef --- /dev/null +++ b/style.css @@ -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 +} \ No newline at end of file diff --git a/template.md b/template.md new file mode 100644 index 0000000..dd67ae3 --- /dev/null +++ b/template.md @@ -0,0 +1,13 @@ +# Title + +--- + +*[status: **?**](?metadata)* + +CONTENT + +--- + +[last tended to: **?** +
+planted: **?**](?metadata) diff --git a/twitter/misc.md b/twitter/misc.md new file mode 100644 index 0000000..2345e35 --- /dev/null +++ b/twitter/misc.md @@ -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]] diff --git a/twitter/pukenukem.md b/twitter/pukenukem.md new file mode 100644 index 0000000..7bb6caa --- /dev/null +++ b/twitter/pukenukem.md @@ -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]] diff --git a/twitter/quiver.md b/twitter/quiver.md new file mode 100644 index 0000000..0d07544 --- /dev/null +++ b/twitter/quiver.md @@ -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]] diff --git a/twitter/tweetcarts.md b/twitter/tweetcarts.md new file mode 100644 index 0000000..0fdd74e --- /dev/null +++ b/twitter/tweetcarts.md @@ -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]] diff --git a/twitter/tweets/10_11_2020.md b/twitter/tweets/10_11_2020.md new file mode 100644 index 0000000..e8e3c66 --- /dev/null +++ b/twitter/tweets/10_11_2020.md @@ -0,0 +1,13 @@ +{{{ + "planted": "10/11/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* Goopy! + Result of about 6 hours of tinkering with softbody physics in #pico8, with the target of making something slime-like. + Not quite what I was going for, but still neat! Might continue and repurpose it into something for the #macojam + +![](media/10_11_2020.gif) + +*gardener's note: I really like how this looks. The colors and dithering mixed with the fake 3D have a cool vibe--I couldn't figure out better physics to make this more playable though. I think I started this for the "monsters are cute, OK?" game jam.* \ No newline at end of file diff --git a/twitter/tweets/10_18_2020.md b/twitter/tweets/10_18_2020.md new file mode 100644 index 0000000..8d80f0a --- /dev/null +++ b/twitter/tweets/10_18_2020.md @@ -0,0 +1,12 @@ +{{{ + "planted": "10/18/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* The #pico8 native map editor wasn't quite scaling to my needs, so I decided it was time to make some tooling for my engine. Now I can do more complicated maps quicker, without leaving PICO-8! + (Buttons are from @tommulgrew's #IMGUI cart, which let me prototype way easier!) + +![](media/10_18_2020.gif) + +* Sorry, I forgot to link the GUI library! you can find it here, if you're interested: [https://lexaloffle.com/bbs/?tid=35889](https://lexaloffle.com/bbs/?tid=35889) \ No newline at end of file diff --git a/twitter/tweets/10_24_2020.md b/twitter/tweets/10_24_2020.md new file mode 100644 index 0000000..510c7b1 --- /dev/null +++ b/twitter/tweets/10_24_2020.md @@ -0,0 +1,54 @@ +{{{ + "planted": "10/24/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* My first #tweetcart! Trying out some lighting +(not included: generating the screen by calling help) + #pico8 + (source in thread) + +![](media/10_24_2020.gif) + +

+b=0🐱={10,9,4,2,1,0}m=mset +memcpy(0,6<<12,8192)::_::s=sin +cls()sspr(0,0,128,128)c=cos +for d=0,1,.01do +h=t()/16x=c(h)*s(2*h)*32+64y=s(h)*c(h)*32+64 +❎=c(d)⧗=s(d) +i=0while i<30do +p=sget(x,y) +if(p!=b)i+=6goto l +pset(x,y,🐱[(i+rnd(3))\5+1])::l:: +y+=⧗ +i+=1x+=❎ +end +end +flip()goto _ +

+ +

+--Mouse! +poke(0x5f2d,1)🐱={10,9,4,2,1,0}m=mset +s=sin +c=cos +memcpy(0,6<<12,8192)::_:: +cls()sspr(0,0,128,128) +for d=0,1,.01do +x=stat(32)y=stat(33) +❎=c(d)⧗=s(d) +i=0while i<30do +p=sget(x,y) +if(p!=0)i+=4goto l +pset(x,y,🐱[(i+rnd(3))\5+1])::l:: +x+=❎ +y+=⧗ +i+=1 +end +end +flip()goto _ +

+ +* just realized I had a bunch of deprecated lines in there that could be removed -- oops! These could probably be cut down to 240 characters, not that it matters too much. \ No newline at end of file diff --git a/twitter/tweets/10_24_2020_2.md b/twitter/tweets/10_24_2020_2.md new file mode 100644 index 0000000..9f16d65 --- /dev/null +++ b/twitter/tweets/10_24_2020_2.md @@ -0,0 +1,15 @@ +{{{ + "planted": "10/24/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* Testing out some new textures made with #pixatool, I think they turned out really well! How does it look? + #pico8 #gamedev #indiedev + +![](media/10_24_2020_2.gif) + +* Pixatool is made by [@DavitMasia](https://twitter.com/DavitMasia) and can be bought here: + [https://kronbits.itch.io/pixatool](https://kronbits.itch.io/pixatool) + +*gardener's note: "can be bought" bitch you used the demo version and you know it* \ No newline at end of file diff --git a/twitter/tweets/10_28_2020.md b/twitter/tweets/10_28_2020.md new file mode 100644 index 0000000..977cad8 --- /dev/null +++ b/twitter/tweets/10_28_2020.md @@ -0,0 +1,24 @@ +{{{ + "planted": "10/28/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* Recamán's sequence #tweetcart! I think this might've been done but I wanted to make it as well. Visuals based on Numberphile's video: https://youtu.be/FGC5TdIiT9U + (source in thread) + #pico8 #tweetjam + +![](media/10_28_2020.gif) + +

+a={[0]=0}s=0p={}cls(1)::_:: +s=ceil(t()*2) +if(a[s])goto s +v=a[s-1]-s +if(v<=0or p[v])a[s]=a[s-1]+s else a[s]=v +::s:: +d=t()%.5◆=(a[s]+a[s-1])r=a[s]-a[s-1]⬅️=64*(s%2)⧗=0▒=◆-cos(d)*r+2 +if(r<0)r=-r ⧗=◆+cos(d)*r-2▒=128 +clip(⧗,⬅️,▒,64+⬅️)circ(◆,64,r,7)p[a[s]]=1flip() +goto _ +

\ No newline at end of file diff --git a/twitter/tweets/10_31_2020.md b/twitter/tweets/10_31_2020.md new file mode 100644 index 0000000..09cc6b1 --- /dev/null +++ b/twitter/tweets/10_31_2020.md @@ -0,0 +1,25 @@ +{{{ + "planted": "10/31/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* I'm going to be the first to start the genre of '[PooM](https://freds72.itch.io/poom)-clones', I think mine is coming along pretty nicely! + #pico8 + +![](media/10_31_2020.gif) + +* Behind the scenes! I'm doing a realtime traversal of the nodes, which gives me some advantages in clipping the drawing to minimize overdraw: + #pico8 #putaflipinit + +![](media/10_31_2020_2.gif) + +* Something looks a little off here... + Last post for today I promise + #pico8 + +![](media/10_31_2020_3.gif) + +* [@FSouchu](https://twitter.com/FSouchu)'s behind the scenes GIFs of PooM were invaluable in getting this far, especially the one about back-to-front rendering! If you haven't already, go follow him he's doing astonishing things. + +*gardener's note: I was so proud of how well this worked. I had previously attempted a DooM style rendering engine in pico-8, but couldn't manage to properly adapt the algorithms in a performant manner. Interestingly, the big optimization is actually to stop optimizing--DooM keeps a pseudo-depth buffer to prevent overdraw, but that's mathematically expensive. Pixel splatting operations are cheap enough in pico-8 to make a traditional back-to-front "painter's algorithm" approach work far faster than being smart about overdraw.* \ No newline at end of file diff --git a/twitter/tweets/11_13_2020.md b/twitter/tweets/11_13_2020.md new file mode 100644 index 0000000..ad85c18 --- /dev/null +++ b/twitter/tweets/11_13_2020.md @@ -0,0 +1,26 @@ +{{{ + "planted": "11/13/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* I really love math-based #tweetcarts, so here's some constant width triangle trickery! The shapes are always touching those directly adjacent to them in their level. + (source in replies) + #pico8 #tweetjam + +![](media/11_13_2020.gif) + +

+camera(-64,-64)s=sin +function a(x,y,r,sd,d,o)p=6.3*abs(r)for i=sd,d,1/p do +pset(x+c(i)*r,y+s(i)*r,o)end +end +::_::cls()c=cos +m=t()/8for r=0,6do +for m=m,m+1,1/r/6do +x=c(-m)*r*14y=s(-m)*r*14for m=0,1,1/3do +e=x+c(m)*8f=y+s(m)*8a(e,f,-13.5,m-1/12,m+1/12,r+8)end +end +end +flip()goto _ +

diff --git a/twitter/tweets/11_13_2020_2.md b/twitter/tweets/11_13_2020_2.md new file mode 100644 index 0000000..93800da --- /dev/null +++ b/twitter/tweets/11_13_2020_2.md @@ -0,0 +1,32 @@ +{{{ + "planted": "11/13/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* Is there a market for cursed #pico8 functions? + +![](media/11_13_2020.png) + +* Probably not, but here are some actually useful overrides! +

+_min=min +function min(f,...) +arg={...} m=f +for v in all(arg)do +m=_min(v,m) +end +return m +end + +_max=max +function max(f,...) +arg={...} m=f +for v in all(arg)do +m=_max(v,m) +end +return m +end +

+ +*gardener's note: I almost didn't repot this one, but it's so absurd and brings me joy. The `mid` function in pico-8 typically returns the median of the 3 arguments passed to it. I was messing with `...` params in Lua and figured out I could override functions, so I created this abomination. The other two are relatively useful, and an "average" function could be created in a similar way.* diff --git a/twitter/tweets/11_15_2020.md b/twitter/tweets/11_15_2020.md new file mode 100644 index 0000000..c523e68 --- /dev/null +++ b/twitter/tweets/11_15_2020.md @@ -0,0 +1,13 @@ +{{{ + "planted": "11/15/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* Nerdsniped! Here's a quick and dirty #pico8 #tweetcart I made that compresses 32x8 1bpp sprites into one 8x8 4bpp sprite! I've actually been wanting to make this for a while, and this pushed me to doing it, in a tweetcart since it's easier to share. (source in reply!) + +![](media/11_15_2020.gif) + +* [replies](?twitter__tweets__11_15_2020_replies) + +*gardener's note: split the replies into a separate page since this is more in-the-weeds than most of the other tweets. This was a quote tweet, but the original got deleted.* \ No newline at end of file diff --git a/twitter/tweets/11_15_2020_replies.md b/twitter/tweets/11_15_2020_replies.md new file mode 100644 index 0000000..169a343 --- /dev/null +++ b/twitter/tweets/11_15_2020_replies.md @@ -0,0 +1,51 @@ +{{{ + "planted": "11/15/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +

+cls() +while(not btn(4))print("press 🅾️ to confirm",32,61,8) +o=8 +for y=0,128do +for i=0,128/o,4do +for x=i*o,i*o+o do +if(sget(x,y)!=0)sset(x,y,1) +for s=1,3do +if(sget(x+s*o,y)!=0)sset(x,y,sget(x,y)|(1<

+ +### [@ThatTomHall](https://twitter.com/ThatTomHall) +* Very cool! A draw_compressed_sprite or decompress_sprites routine would rock too. + +### ValerADHD + +* Absolutely! It's a little odd because #pico8 has an inbuilt feature for doing color masking, but since it works directly on the draw palette it's hard to handle drawing different colors. I'll put two functions in the replies, one using pure bitmasking and one with actual coloring + +

+--colored manual bitmasking! +function spr_1bpp_colored(sp,layer,col,x,y,w,h) +mask=1<

+ +

+--uncolored, pure bitmasking! +function spr_1bpp(sp,layer,x,y,w,h) +poke(0x5f5e,(1<

\ No newline at end of file diff --git a/twitter/tweets/11_17_2020.md b/twitter/tweets/11_17_2020.md new file mode 100644 index 0000000..2fe6d5a --- /dev/null +++ b/twitter/tweets/11_17_2020.md @@ -0,0 +1,31 @@ +{{{ + "planted": "11/17/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* Anyone up for a game of snake? wait a minute... + + I made an implementation of FABRIK inverse kinematics in a #pico8 #tweetcart! (source in replies) + #tweetjam + +![](media/11_17_2020.gif) + +

+poke(24365,1)x={}y={}z=16for i=0,32do +x[i]=0y[i]=0end::_::cls()for j=1,-1,-2do +for i=z-z*j+j,z+z*j,j do +a=x[i]-x[i-j]b=y[i]-y[i-j]l=(a*a+b*b)^.5a/=l +b/=l +x[i]=x[i-j]+a*4y[i]=y[i-j]+b*4end +end +for i=0,32do +circfill(x[i],y[i],2,i%8+8)end +x[0]=stat(32)y[0]=stat(33)flip()goto _ +

+ +* This implementation was based on a great cart and writeup by [@2DArray](https://twitter.com/2DArray), which can be found here! + [https://lexaloffle.com/bbs/?pid=42900](https://lexaloffle.com/bbs/?pid=42900) + +*gardener's note: I love the simplicity of this algorithm. It's really satisfying that such a complex problem can be approximated with such basic constraint solving.* + diff --git a/twitter/tweets/11_20_2020.md b/twitter/tweets/11_20_2020.md new file mode 100644 index 0000000..95a910c --- /dev/null +++ b/twitter/tweets/11_20_2020.md @@ -0,0 +1,26 @@ +{{{ + "planted": "11/20/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* I may have gotten a little bit sidetracked from my original goal of a 'boids' simulation... but I think this turned out cooler than any boids I could've fit in a #tweetcart otherwise! +#pico8 #tweetjam +(source in replies) + +![](media/11_20_2020.gif) + +

+cls(7)k=rnd +x={}y={}r={}for i=0,30do +x[i]=k(128)y[i]=k(128)r[i]=k()end +::_:: +for i=1,#x do +for j=1,#x do +if(i!=j)a=x[i]-x[j]b=y[i]-y[j]d=atan2(a,b)l=(a*a+b*b)^.5r[i]+=d/l/8-(d-r[i])/l/12end +pset(x[i],y[i],i%8+8)x[i]+=cos(r[i])y[i]+=sin(r[i])x[i]%=128y[i]%=128end +goto _ +

+ +* Boids are a way of simulating flocking birds using simple rules. The wikipedia page explains it well: [https://en.wikipedia.org/wiki/Boids](https://en.wikipedia.org/wiki/Boids) +(I like to think that they were originally just birds but the author had a heavy accent) diff --git a/twitter/tweets/11_21_2020.md b/twitter/tweets/11_21_2020.md new file mode 100644 index 0000000..85a4900 --- /dev/null +++ b/twitter/tweets/11_21_2020.md @@ -0,0 +1,26 @@ +{{{ + "planted": "11/21/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* that's not social distancing! #pico8 #tweetcart #tweetjam + (source in replies) + +![](media/11_21_2020.gif) + +

+poke(24365,1)x={}y={}for i=1,57do +x[i]=rnd(99)y[i]=rnd(99)end::_::cls(3)for i=1,#x do +x[i]+=(stat(32)-x[i])/32y[i]+=(stat(33)-y[i])/32for j=1,#x do +if i!=j then +a=x[i]-x[j]b=y[i]-y[j]l=(a*a+b*b)^.5 +if(l<4)x[j]-=a*(4-l)/2y[j]-=b*(4-l)/2 +end +end +?"웃",x[i],y[i],i +end +flip()goto _ +

+ +*gardener's note: this one makes me laugh. Also, the original gif for this one was recorded from a cart named "childtweet", which I think adds to it. Not sure what the original goal of this was.* \ No newline at end of file diff --git a/twitter/tweets/11_22_2020.md b/twitter/tweets/11_22_2020.md new file mode 100644 index 0000000..3e6d94f --- /dev/null +++ b/twitter/tweets/11_22_2020.md @@ -0,0 +1,23 @@ +{{{ + "planted": "11/22/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* creeping in from the edges... +

+ r=90 + rect(0,0,128,128,0) + ::_:: + for i=0,99do + d=rnd() + x=r*cos(d)+64y=r*sin(d)+64 + r-=.0025 + circfill(x,y,1,pget(x,y)) + end + if(r<0)stop() + flip()goto _ +

+ #pico8 #tweetcart #tweetjam + +![](media/11_22_2020.gif) \ No newline at end of file diff --git a/twitter/tweets/11_26_2020.md b/twitter/tweets/11_26_2020.md new file mode 100644 index 0000000..37438c7 --- /dev/null +++ b/twitter/tweets/11_26_2020.md @@ -0,0 +1,9 @@ +{{{ + "planted": "11/26/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* I'm starting to make a little #pico8 demo cart/library for a bunch of animation curves! I've been wondering how these were done and recently found http://easings.net, a great little compilation of them! here's an elastic function as a sneak-preview! + +![](media/11_26_2020.gif) \ No newline at end of file diff --git a/twitter/tweets/11_26_2020_2.md b/twitter/tweets/11_26_2020_2.md new file mode 100644 index 0000000..8c09e57 --- /dev/null +++ b/twitter/tweets/11_26_2020_2.md @@ -0,0 +1,25 @@ +{{{ + "planted": "11/26/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* I just hit 256 followers! thanks everyone so much for enjoying and following what I do, and I hope to keep doing it some more! I guess that means I can't use anymore 8 bit numbers for my follower count... #pico8 #tweetcart #tweetjam (source in replies + +![](media/11_26_2020_2.gif) + +*

+poke(0x5f2c,3)n=0r=rnd::_::cls(1) +?"followers: "..n\1,4,16 +for i=0,7do +?n>>i&1,44-i*4,28 +end +if(n<255)n+=t()n=min(n,255)else n+=t()%.1 +if(n>=256.5) goto a +flip()goto _::a::for i=0,999do pset(r(64),r(64),1)end +circfill(r(64),r(64),r(7),r(8)+8) +?"thank you!",12,28,7 +flip()goto a +

+ +*gardener's note: that parenthetical was left unclosed in the original tweet too. real professional stuff here.* \ No newline at end of file diff --git a/twitter/tweets/11_26_2020_3.md b/twitter/tweets/11_26_2020_3.md new file mode 100644 index 0000000..5d332c1 --- /dev/null +++ b/twitter/tweets/11_26_2020_3.md @@ -0,0 +1,31 @@ +{{{ + "planted": "11/26/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* I made a conjoined #tweetcart! I joined the ideas of randomized mazes and color wars to make a cool cart, and an *extremely* compact one to go along with it! I encourage anyone with experience to look at the code (in replies), I think there's a few neat tricks in there. #pico8 + +![](media/11_26_2020_3.gif) + +

+cls()w=128r=rnd +for i=0,99do +?1,r(w),r(w),i|8 +end +for i=0,999do +?chr(-r(2)),i%22*6,i\22*4,7 +end::_::x=r(w)\1*6y=r(w)\1*4 +?"◆",x,y,0 +?chr(-r(2)),x,y,7 +for i=0,99do +x=r(w)y=r(w)k=pget(x,y)if k>7then +for d=0,1,.25do +a=x+cos(d)b=y+sin(d) +if(pget(a,b)!=7)pset(a,b,k)end +end +end +goto _ +

+ +*gardener's note: I can't put my finger on it, but the way this tweet is written makes me sound crazy. I hadn't quite fixed how repetitive my word choice can be at times.* \ No newline at end of file diff --git a/twitter/tweets/11_27_2020.md b/twitter/tweets/11_27_2020.md new file mode 100644 index 0000000..f91400c --- /dev/null +++ b/twitter/tweets/11_27_2020.md @@ -0,0 +1,13 @@ +{{{ + "planted": "11/27/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* I just released a (relatively) complete library and demo of easing functions for use in your #pico8 programs! check it out here: [https://lexaloffle.com/bbs/?tid=40577](https://lexaloffle.com/bbs/?tid=40577) + +![](media/11_27_2020.gif) + +* I forgot to add! you can load it straight into your Pico-8 application by doing 'load #easingcheatsheet' + +*gardener's note: The equations & graphs were fun to make--I think this might've been one of the first times I discovered LaTeX typesetting. I was tempted to create a pico-8 LaTeX engine, but wisely decided not to.* \ No newline at end of file diff --git a/twitter/tweets/11_28_2020.md b/twitter/tweets/11_28_2020.md new file mode 100644 index 0000000..4f85f51 --- /dev/null +++ b/twitter/tweets/11_28_2020.md @@ -0,0 +1,9 @@ +{{{ + "planted": "11/28/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* update! I added an 'out/in' version of each function that previously had an 'in/out' version! thanks [@benjamin_soule_]() for telling me about these. + +![](media/11_28_2020.gif) \ No newline at end of file diff --git a/twitter/tweets/11_2_2020.md b/twitter/tweets/11_2_2020.md new file mode 100644 index 0000000..e8880a2 --- /dev/null +++ b/twitter/tweets/11_2_2020.md @@ -0,0 +1,32 @@ +{{{ + "planted": "11/2/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* Orbiting. +

+r=rnd +c=circfill +cls()x=32y=32w=1z=0m=10o=96p=96q=-1n=0g=50_set_fps(60)::_:: +for i=0,999do +j=r(128)k=r(128)c(j,k,1,max(0,pget(j,k)-1))end +c(x,y,4,7)c(o,p)d=x-o +v=y-p +l=d^2+v^2a=g/l/l^.5i=a*m +w-=d*i +z-=v*i +q+=d*i +n+=v*i +x+=w +y+=z +o+=q +p+=n +flip()goto _ +

+ + #pico8 #tweetjam + +![](media/11_2_2020.gif) + +*gardener's note: I think that this tweet exemplifies what I liked most about pico-8. I wrote this while tuning out a Zoom lecture on Newton's Law of Gravitation in my highschool physics course. In ~an hour I was able to get a satisfying visualization with some basic mathematical backing, without once having to fight some stupid ass low-level display library.* \ No newline at end of file diff --git a/twitter/tweets/11_2_2020_2.md b/twitter/tweets/11_2_2020_2.md new file mode 100644 index 0000000..d721f69 --- /dev/null +++ b/twitter/tweets/11_2_2020_2.md @@ -0,0 +1,14 @@ +{{{ + "planted": "11/2/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* So many features of #pico8 allow the developer experience to be so much more fun than anywhere else, but of all of those, the 'flip()' command has to be the most useful for my applications. I wouldn't have been able to do half the optimization I've done without it. + #putaflipinit + +![](media/11_2_2020_2.gif) + +* [replies](?twitter__tweets__11_2_2020_2_replies) + +*gardener's note: love this visualization. I also love the map that's being drawn--I was messing with how dynamic I could make the environments in this engine. The walls are attached to rising floors, which makes the top of the texture move upward (very similar to how the actual DooM engine does things!)* \ No newline at end of file diff --git a/twitter/tweets/11_2_2020_2_replies.md b/twitter/tweets/11_2_2020_2_replies.md new file mode 100644 index 0000000..6d9d529 --- /dev/null +++ b/twitter/tweets/11_2_2020_2_replies.md @@ -0,0 +1,13 @@ +{{{ + "planted": "11/3/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +### [Frederic Souchu (@FSouchu)](https://twitter.com/FSouchu) +* How will you clip floor/ceiling as seen from behind a pillar? Multiple rasterization 😱? + +### ValerADHD +* Not quite! I do a loop through all of my 'draw calls' for each sector and combine the bounds to stretch from the lowest visible part to the highest visible part in any call, and the farthest left to the farthest right. It's more expensive, but still slightly faster in the end! + +![](media/11_3_2020.gif) \ No newline at end of file diff --git a/twitter/tweets/11_5_2020.md b/twitter/tweets/11_5_2020.md new file mode 100644 index 0000000..47cdd34 --- /dev/null +++ b/twitter/tweets/11_5_2020.md @@ -0,0 +1,48 @@ +{{{ + "planted": "11/5/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* I made a demake of the mobile game "Ready... Steady... Bang!" in 560 characters for #TweetTweetJam5! + It was a tight fit, but I was able to fit a sound effect (1), AI, a 2 player mode, and a barebones menu! + Play it here: https://valeradhd.itch.io/rd-std-duel + (source in replies) + #pico8 + +![](media/11_5_2020.gif) + +

+cls()poke4(12800,4011)s=spr +?"웃~" +memcpy(0,24576,512)b=btn +h=64j=60k=print +::m::k("❎ duel! ⬅️ ai",36,9)a=nil +if(b(0))a=1 +if(b(5))d=t()c=1p="READY.."goto _ +goto m +::_:: +m=t()r=rnd +cls()s(0,26,j,2,1)s(0,86,j,2,1,true) +if(m-d>=c)d=m+r(c*5)p="STEADY.."c+=.5 +color(3+c*2) +if(c>=2)p="bang!" +x=(m-d)*4+2y=h-x +if(y=2and y.9and a and f)poke(24397,16) +if b()&4112>0then +sfx(0) +if(c>=2)n=2else n=5 +o=28 +if(b(4,0))o=99 +pset(o+r(n),j+r(n),n)pal(0,7,1)flip() +w=1if(o==99!=f)w=2 +pal()k("★player "..w.." wins!★",28,0,10)goto m +end +flip()goto _ +

+ +*gardener's note: objectively, this game is ass. it's funny that it's technically the first game I ever published (on itch.io).* + +*this game sticks out to me pretty strongly from my childhood--I'm not sure how much I actually played it, but it definitely made a mark.* diff --git a/twitter/tweets/11_6_2020.md b/twitter/tweets/11_6_2020.md new file mode 100644 index 0000000..073d62b --- /dev/null +++ b/twitter/tweets/11_6_2020.md @@ -0,0 +1,14 @@ +{{{ + "planted": "11/6/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* That recent twitter post about subpixel rendering in #pico8 sent me down the rabbithole of coding my own implementations for a couple of shapes... I think I'm in love + +![](media/11_6_2020.gif) + +* Inspiration for the chaos above ^^ + ![https://twitter.com/zovirl/status/1324155476863459329](Quoted Tweet) + +*gardener's note: I ended up writing a minified version of my [VectorDoom](?twitter__vectordoom) engine that ran at 60fps with subpixel lines--it was super satisfying, but as with everything else, it went unfinished. I think I'd use that version of the engine for any future projects* diff --git a/twitter/tweets/11_7_2020.md b/twitter/tweets/11_7_2020.md new file mode 100644 index 0000000..74e5836 --- /dev/null +++ b/twitter/tweets/11_7_2020.md @@ -0,0 +1,37 @@ +{{{ + "planted": "11/7/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* I wanted to make a more technically impressive game for #TweetTweetJam5, so I spent a bit of time making "Islehopper"! fly around procedurally generated 3D worlds in this 560 character game! https://valeradhd.itch.io/islehopper-ttj5 + (source in replies) #pico8 + +![](media/11_7_2020.gif) + +

+pal({[0]=1,15,143,138,11,139,3,131,132,5,6,7,7,7,12},1)cls()_=127n=rnd +x=32q=cos +y=32u=sin +d=0z=8w=64e=64l=line +for i=0,30do +a=n(_)b=n(_)r=n(9)for i=1,9do +circfill(a,b,r,i)r-=n(4)end +end +memcpy(0,6<<12,8192)::_:: +cls(14)for i=0,_ do +a=x +b=y +r=d+(i/256)-.25p=_ +for j=1,24do +a+=q(r)b+=u(r)h=sget(a&_,b&_)s=sin(t()/8)*4+64-(h-z)*64/j +if(s

+ +*gardener's note: this one turned out underwhelming. this style of raycasting is slightly too intensive to be done well in pico-8* diff --git a/twitter/tweets/11_7_2020_2.md b/twitter/tweets/11_7_2020_2.md new file mode 100644 index 0000000..683dcd9 --- /dev/null +++ b/twitter/tweets/11_7_2020_2.md @@ -0,0 +1,26 @@ +{{{ + "planted": "11/7/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* Islands! This was the originally planned island generation for "Islehopper", but I had to cut most of it due to running out of space :( (source in replies) + #tweetcart #tweetjam #pico8 + +![](media/11_7_2020_2.gif) + +

+pal({[0]=12,15,143,138,11,139,3,131,132,5,6,7},1)cls()f=circfill +_=128n=rnd +q=cos +u=sin +for i=0,5do +a=n(_)b=n(_)c=a+q(n())*16d=b+u(n())*16r=n(9)+8s=n(8)for i=1,9do +f(a,b,r,i)f(c,d,s)r-=n(4)s-=n()end +end +for i=0,⧗ do +x=n(_)y=n(_)f(x,y,1,pget(x,y))end +::_:: +if(t()>1)run() +goto _ +

diff --git a/twitter/tweets/11_7_2020_3.md b/twitter/tweets/11_7_2020_3.md new file mode 100644 index 0000000..dff6e36 --- /dev/null +++ b/twitter/tweets/11_7_2020_3.md @@ -0,0 +1,11 @@ +{{{ + "planted": "11/7/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* I just uploaded my subpixel rendering testbed to the #pico8 BBS, so if anyone was interested in using the code in their own projects or just seeing how it was done, feel free to steal it! You can find it at + [https://lexaloffle.com/bbs/?tid=40279](https://lexaloffle.com/bbs/?tid=40279) + or by typing "load #subpix" into the command line + +![](media/11_7_2020_3.gif) diff --git a/twitter/tweets/11_8_2020.md b/twitter/tweets/11_8_2020.md new file mode 100644 index 0000000..e5cd0da --- /dev/null +++ b/twitter/tweets/11_8_2020.md @@ -0,0 +1,41 @@ +{{{ + "planted": "11/8/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* I guess this isn't really a game, but I made a .obj 3D model file viewer for #TweetTweetJam5! It takes real .obj file data, converts it into Pico-8 memory, and then renders it in wireframe! Mess with it here: [https://valeradhd.itch.io/obj-fv-ttj5](https://valeradhd.itch.io/obj-fv-ttj5) + (Source in replies) + #pico8 + +![](media/11_8_2020.gif) + +

+cls()u=unpack +p={}e={}q=0w=0m=1s=split::x:: +o=stat(4)print("paste in .obj file",28,61) +if(#o<1)goto x +for i in all(s(o,"\n"))do +d=s(i," ") +if(ord(i)==118)add(p,d) +if(ord(i)==108)add(e,d)end +camera(-64,-64)::_:: +cls()s=sin(q)d=cos(q)f=sin(w)g=cos(w)for i in all(e)do +_,x,y,z=u(p[i[2]])_,a,b,c=u(p[i[3]])x,z=x*d+z*s,d*z-x*s +a,c=a*d+c*s,d*c-a*s +y,z=y*g-z*f,y*f+z*g +b,c=b*g-c*f,b*f+c*g +a*=m +b*=m +c*=m +x*=m +y*=m +z*=m +c-=4z-=4x=x/z*64y=y/z*64a=a/c*64b=b/c*64line(x,y,a,b)end +b=btn()q+=(b\2%2-b%2)/30w+=(b\8%2-b\4%2)/30 +if(btn(4))m+=.01 +if(btn(5))m-=.01 +flip()goto _ +

+ +*gardener's note: I'm still shocked I was able to get this to work. It's one of my favorite proof-of-concept pieces I've done, even if the ""input"" method makes it near impossible to use (can't abuse the paste function on mobile devices)* diff --git a/twitter/tweets/12_11_2020.md b/twitter/tweets/12_11_2020.md new file mode 100644 index 0000000..8388c9c --- /dev/null +++ b/twitter/tweets/12_11_2020.md @@ -0,0 +1,14 @@ +{{{ + "planted": "12/11/2020", + "repotted": "12/10/2025", + "nobreak": "true" +}}} + +* How are you going to have a first person shooter without a first person shootie!? (I finally added a weapon to my #7dfps game, so that's a milestone, I guess😅) + #pico8 #gamedev #indiedev + +![](media/12_11_2020.gif) + +* a fun behind-the-scenes: this isn't actually a solid 3D model! I just have the wireframe drawn and I manually clipped any overdraw when I modelled it in blender. The view angle varies very little, so it's almost unnoticeable! (unless you're looking for it :P) + +![](media/12_11_2020_2.jpg) \ No newline at end of file diff --git a/twitter/tweets/12_12_2020.md b/twitter/tweets/12_12_2020.md new file mode 100644 index 0000000..88410aa --- /dev/null +++ b/twitter/tweets/12_12_2020.md @@ -0,0 +1,12 @@ +{{{ + "planted": "12/12/2020", + "repotted": "12/10/2025", + "nobreak": "true" +}}} + +* I finally got my enemy walking around! It's minor, but it means that my #7dfps game now has AI! (on day 8😅) + #pico8 #screenshotsaturday #gamedev #indiedev + +![](media/12_12_2020.gif) + +*gardener's note: I miss when AI basically only referred to games. This is a state machine.* \ No newline at end of file diff --git a/twitter/tweets/12_13_2020.md b/twitter/tweets/12_13_2020.md new file mode 100644 index 0000000..da98ecf --- /dev/null +++ b/twitter/tweets/12_13_2020.md @@ -0,0 +1,16 @@ +{{{ + "planted": "12/13/2020", + "repotted": "12/10/2025", + "last_tended_to": "12/10/2025", + "nobreak": "true" +}}} + +* I got enemies and weapons working together! (also mouselook, which is awesome!) for my #7dfps project! I think it's actually starting to resemble an FPS! + #pico8 + +![](media/12_13_2020.gif) + +* pssst! don't tell anyone (no retweets, please) but I uploaded a demo if you want to try it! I needed to reach the deadline for submissions, but it's *very* barebones so don't expect much! I'll continue updating it over the week. + [valeradhd.itch.io](https://valeradhd.itch.io/untitled-7dfps-project) + +*gardener's note: For ~9 days of work, I'm really proud of how well this **tech demo** works. Definitely not a game though.* \ No newline at end of file diff --git a/twitter/tweets/12_18_2020.md b/twitter/tweets/12_18_2020.md new file mode 100644 index 0000000..9761e6a --- /dev/null +++ b/twitter/tweets/12_18_2020.md @@ -0,0 +1,16 @@ +{{{ + "planted": "12/18/2020", + "repotted": "12/10/2025", + "last_tended_to": "12/10/2025", + "nobreak": "true" +}}} + +* Most glitches are a royal pain to debug, which is why I find it even more fun when they are clear and goofy. Here’s one from my #7dfps game, while testing out new art and animations on my enemies. Do a little dance! + #pico8 #gamedev #indiedev + +![](media/12_18_2020.gif) + +* Also, the currently published demo should now support mobile devices! huge thanks to [@FSouchu](https://twitter.com/fsouchu) + for both making a wonderful FPS template and publishing it for all to use! + Find the demo here: + [valeradhd.itch.io](https://valeradhd.itch.io/untitled-7dfps-project) \ No newline at end of file diff --git a/twitter/tweets/12_1_2020.md b/twitter/tweets/12_1_2020.md new file mode 100644 index 0000000..ca46f3a --- /dev/null +++ b/twitter/tweets/12_1_2020.md @@ -0,0 +1,17 @@ +{{{ + "planted": "12/1/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* How (doom style) 3D projection works in 2 and a half minutes! + #programming #indiedev #gamedev + made in #pico8 + (split up form, with text: [https://imgur.com/a/DjyHKag](https://imgur.com/a/DjyHKag)) + run it in your browser! [https://lexaloffle.com/bbs/?tid=40619](https://lexaloffle.com/bbs/?tid=40619) + +![](media/12_1_2020.gif) + +*gardener's note: this was the biggest tweet I ever posted. It got over 3k likes, skyrocketed my follower count, and connected me to a ton of cool people. I think that even Intel reposted it on their account (back when companies wanted to be on Twitter).* + +*Making this large of a gif was a pain in the ass. Did you know that GIFs don't actually run at 30 or 60fps? You have to specify the \*hundredths of a second\* that each frame displays for. This gif is running at 33FPS IIRC* \ No newline at end of file diff --git a/twitter/tweets/12_20_2020.md b/twitter/tweets/12_20_2020.md new file mode 100644 index 0000000..f1e7220 --- /dev/null +++ b/twitter/tweets/12_20_2020.md @@ -0,0 +1,10 @@ +{{{ + "planted": "12/20/2020", + "repotted": "12/10/2025", + "nobreak": "true" +}}} + +* What makes me a good demoman? If I were a bad demoman, I wouldn't be sittin' here talking to you right now, would I!? (ignore the grenade shooting shotgun😅) + #pico8 #7dfps + +![](media/12_20_2020.gif) \ No newline at end of file diff --git a/twitter/tweets/12_29_2020.md b/twitter/tweets/12_29_2020.md new file mode 100644 index 0000000..fcfcec0 --- /dev/null +++ b/twitter/tweets/12_29_2020.md @@ -0,0 +1,11 @@ +{{{ + "planted": "12/29/2020", + "repotted": "12/10/2025", + "nobreak": "true" +}}} + +* Here's a small update since I haven't posted in 8 days😅, FOV adjustment! It's really neat, because it actually barely changes the math behind the scenes. Sorry for the big break in posting, I've been taking a break over the holidays! #7dfps #pico8 + +![](media/12_29_2020.gif) + +*gardener's note: she's starting to crack. But genuinely--I was incredibly obsessed with being able to post these snappy gifs to get likes on twitter for that sweet dopamine hit. I think I was working on internal engine stuff that couldn't be shown off easily or something. It was also Christmas. Twitter brain hit hard.* \ No newline at end of file diff --git a/twitter/tweets/12_2_2020.md b/twitter/tweets/12_2_2020.md new file mode 100644 index 0000000..4cfc5f3 --- /dev/null +++ b/twitter/tweets/12_2_2020.md @@ -0,0 +1,13 @@ +{{{ + "planted": "12/2/2020", + "repotted": "12/10/2025", + "nobreak": "true" +}}} + +* Testing out some possible art styles in preparation for #7dfps this Friday, I think this one is promising! +(based on models and animations from http://mixamo.com) +#pico8 + +![](media/12_2_2020.gif) + +*gardener's note: I was really into rotoscoping as an artstyle, but wasn't skilled nor patient enough to do anything real with it. I figured out I could do these wireframe tracings of mocap renders, which worked extremely well for space-savings/performance (important in pico-8) while also not being that time consuming to author.* \ No newline at end of file diff --git a/twitter/tweets/12_30_31_2020.md b/twitter/tweets/12_30_31_2020.md new file mode 100644 index 0000000..1f17fe6 --- /dev/null +++ b/twitter/tweets/12_30_31_2020.md @@ -0,0 +1,60 @@ +{{{ + "planted": "12/30/2020", + "repotted": "12/10/2025", + "nobreak": "true" +}}} + +*gardener's note: These are not all my tweets. This is a conversation with [loren schmidt](https://twitter.com/lorenschmidt), which feels weird to put here. I still love this work though, and I think it's worthwhile. Check out her updated work at [https://www.patreon.com/vacuumflowers](https://www.patreon.com/vacuumflowers)* + +--- + +*replying to [loren schmidt](https://twitter.com/lorenschmidt/status/1344517562193891328)* + +#### ValerADHD *12/30/2020* +* Just wanted to say that I really enjoy all of these little updates you’re giving. I’ve made a heightmap renderer previously, but not to this complexity! All of these little spells and areas are lovely + +#### loren schmidt *12/30/2020* +* thank you so much! oh that's wonderful, i don't run into many people who are into these! i find them somewhat magical. do you have any images or video of yours anywhere? + +#### ValerADHD *12/30/2020* +* I'm not sure I do anymore! I think it may be on an old github though, I can dig it up! + +#### ValerADHD *12/31/2020* +* I found it! this was one of my earlier projects, so it's written in Java in an SDL window. I actually managed to get it quite accurate by using precise raycasting close by, and then lowering quality as it gets further away. As you can see, FPS fluctuates massively. (640x360) + +![https://twitter.com/ValerADHD/status/1344546198447923200](media/12_31_2020_1.gif) + +#### loren schmidt *12/31/2020* +* oh this is so beautiful, one of my favorite things is how they do terrain. it feels so luminous. + +#### ValerADHD *12/31/2020* +* I did end up expanding on it! I didn't include it at first because it's more based on Ken Silverman's Voxlap ([advsys.net/ken/voxlap.htm](http://advsys.net/ken/voxlap.htm)), but it was one of my first attempts at #voxelgamedev! It's fully software rendered, so it's laggy even at an internal resolution of 320x180 + +![https://twitter.com/ValerADHD/status/1344564479372177409](media/12_31_2020_2.gif) + +* I also did an extremely promising test of GPU acceleration on the base rendering algorithm, which ended up being able to get 100FPS at 720p on an IntelHD card. (can you tell I don't get to talk about this often either? :P) + +* I forgot to note that I didn’t include a gif of the last one because the laptop it’s on couldn’t create a stable gif of it with the recorder I’m using 😅 + +#### loren schmidt *12/31/2021* +* ha i hear that, this is such a specific special interest. + and wow, i have never done a voxel renderer! that's neat. how did the gpu acceleration work? was the entire thing a shader? or did you go polygonal? + +#### ValerADHD *12/31/2021* +* I was finally able to record my GPU accelerated version! I had to switch over to my development computer, but now it runs even better! I'm on a Nvidia 960m, and I can hit 200FPS with 1080p. There's a couple of artifacts still to fix, but it's definitely promising! + +![](media/12_31_2020_3.gif) + +#### loren schmidt *12/31/2021* +* oh wow! so this is the compute shader based approach? which operations are done which way? + +#### ValerADHD *12/31/2021* +* Yep! All of the inputs and setup is handled by the C++ code, and then dispatched to a compute shader with some details like position, direction, horizon, etc. Then, each execution of the compute shader does all of the ray casting and calculations for a single column of the screen + +#### [Tom Mulgrew](https://x.com/tommulgrew) *1/1/2021* +* How did you implement your compute shader? CUDA? OpenCL? Something else? + +#### ValerADHD *1/1/2021* +* I'm using SDL2 with OpenGL, using the OpenGL compute shader system. I mostly chose it since it was the easiest for me to get set up with, since I already had experience with SDL and the OpenGL pipeline/GLSL shaders. + +*gardener's second note: I really like these tweets. You can see a few of my non-Pico-8 hyperfixations popping out. I'll have to write up a more complete overview of these projects--they're a large part of how I learned to program and what I'm interested in now.* \ No newline at end of file diff --git a/twitter/tweets/12_3_2020.md b/twitter/tweets/12_3_2020.md new file mode 100644 index 0000000..76412d3 --- /dev/null +++ b/twitter/tweets/12_3_2020.md @@ -0,0 +1,10 @@ +{{{ + "planted": "12/3/2020", + "repotted": "12/10/2025", + "nobreak": "true" +}}} + +* Some early progress on my #7dfps game! I'm using the rendering engine (slightly edited) that I've been working on, but I still need to add collision, AI, and quite a bit more! + #pico8 + +![](media/12_3_2020.gif) \ No newline at end of file diff --git a/twitter/tweets/12_4_2020.md b/twitter/tweets/12_4_2020.md new file mode 100644 index 0000000..5ae5de3 --- /dev/null +++ b/twitter/tweets/12_4_2020.md @@ -0,0 +1,10 @@ +{{{ + "planted": "12/4/2020", + "repotted": "12/10/2025", + "nobreak": "true" +}}} + +* We've got textures! of some sort? These are actually fully 3D wireframes plastered onto the walls, so technically I could add shallow bump mapping for almost no cost! (still needs some alignment work though 😅) + #pico8 #gamedev #indiedev #7dfps + +![](media/12_4_2020.gif) \ No newline at end of file diff --git a/twitter/tweets/12_5_2020.md b/twitter/tweets/12_5_2020.md new file mode 100644 index 0000000..b0c1c37 --- /dev/null +++ b/twitter/tweets/12_5_2020.md @@ -0,0 +1,15 @@ +{{{ + "planted": "12/5/2020", + "repotted": "12/10/2025", + "last_tended_to": "12/10/2025", + "nobreak": "true" +}}} + +* If you're gonna have a custom level format, you're gonna need a custom level editor. I just finished mine for my #7dfps game, built around a doom-like engine! + #pico8 #gamedev #screenshotsaturday #indiedev + +![](media/12_5_2020.gif) + +* finally took a look at the token count on the main engine, 4500 tokens and I haven't even started on entities, AI, or proper collision😬 I may need to do some optimizing... + +*gardener's note: There's an 8,000 token limit in Pico-8. I love this one--the instant switch to being able to test the level is so fun.* \ No newline at end of file diff --git a/twitter/tweets/12_6_2020_1.md b/twitter/tweets/12_6_2020_1.md new file mode 100644 index 0000000..94a232a --- /dev/null +++ b/twitter/tweets/12_6_2020_1.md @@ -0,0 +1,9 @@ +{{{ + "planted": "12/6/2020", + "repotted": "12/10/2025", + "nobreak": "true" +}}} + +* My jaw literally dropped when I saw this, despite being the one who wrote the code for it😂. Thanks to an explanation from [@Enichan](https://peoplemaking.games/@eniko@mastodon.gamedev.place), I managed to implement a (buggy) version of drawing subsectors. Still has quite a bit left to fix, but it's a massive improvement! #pico8 + +![](media/12_6_2020_2.gif) \ No newline at end of file diff --git a/twitter/tweets/12_6_2020_2.md b/twitter/tweets/12_6_2020_2.md new file mode 100644 index 0000000..5ca656a --- /dev/null +++ b/twitter/tweets/12_6_2020_2.md @@ -0,0 +1,18 @@ +{{{ + "planted": "12/6/2020", + "repotted": "12/10/2025", + "last_tended_to": "12/10/2025", + "nobreak": "true" +}}} + +* nothing super visually impressive to show today, but I implemented a precise collision system and quake-like movement! It improves the feel of the game a *ton*, so I'm glad that I got it done. + +*gardener's note: 8 hours later.* + +* Update! I managed to implement subsector rendering ([my last tweet](?twitter__tweets__12_6_2020_1)) into my #7dfps engine! It's a little buggy, but it should be working for almost all cases! + +![](media/12_6_2020.gif) + +*gardener's second note: when I was collecting the original gifs for this I also decided to include this one. It's buggier, but very cool. I love how dynamic the levels could be.* + +![](media/12_6_2020_3.gif) \ No newline at end of file diff --git a/twitter/tweets/12_8_2020.md b/twitter/tweets/12_8_2020.md new file mode 100644 index 0000000..cb3cd13 --- /dev/null +++ b/twitter/tweets/12_8_2020.md @@ -0,0 +1,13 @@ +{{{ + "planted": "12/8/2020", + "repotted": "12/10/2025", + "nobreak": "true" +}}} + +* Wow, this place is starting to look like a dump! +I added a decal system, which will be helpful in differentiating areas from one another (hopefully)! + #7dfps #pico8 #gamedev #indiedev + +![](media/12_8_2020.gif) + +*gardener's note: I very nearly titled this one "[damn bitch, you live like this?](https://i.kym-cdn.com/entries/icons/original/000/028/154/Screen_Shot_2019-01-14_at_1.23.53_PM.jpg)". I was a coward.* \ No newline at end of file diff --git a/twitter/tweets/1_11_2021.md b/twitter/tweets/1_11_2021.md new file mode 100644 index 0000000..33a290d --- /dev/null +++ b/twitter/tweets/1_11_2021.md @@ -0,0 +1,17 @@ +{{{ + "planted": "1/11/2021", + "repotted": "12/3/2025", + "last_tended_to": "12/10/2025", + "nobreak": "true" +}}} + +* thought I'd mess around with making a real 3D #pico8 engine, since I'd only done fake 3D so far. I think it's going pretty well! I love these psychedelic colors for the light ramp. + +![https://twitter.com/ValerADHD/status/1348759586921189382](media/1_11_2021.gif) + +* also I'd be lost without the existing extremely performant triangle rasterizer by [@p01](https://twitter.com/p01), as well as the efficient heap sort by [@CasualEffects](https://twitter.com/CasualEffects)! these are doing the brunt of the calculations, I just tell them where they need to go. +[http://lexaloffle.com/bbs/?tid=31478](http://lexaloffle.com/bbs/?tid=31478) +[http://github.com/morgan3d/misc/...](https://github.com/morgan3d/misc/blob/main/p8sort/sort.p8) + +* I forgot to add! This version of the Stanford bunny is from [@jamesedge’s](https://twitter.com/jamesedge) rendering demo/benchmark of a bunch of neat effects! Find it here: +[http://lexaloffle.com/bbs/?tid=35282](http://lexaloffle.com/bbs/?tid=35282) \ No newline at end of file diff --git a/twitter/tweets/1_16_2021.md b/twitter/tweets/1_16_2021.md new file mode 100644 index 0000000..2e0d211 --- /dev/null +++ b/twitter/tweets/1_16_2021.md @@ -0,0 +1,14 @@ +{{{ + "planted": "1/16/2021", + "repotted": "12/10/2021", + "nobreak": "true" +}}} + +* Hey #screenshotsaturday! I've been slowly finishing my #7dfps #pico8 project, a retro doomclone shooter with a unique vector-inspired style! this week I finally managed to get done with the title screen, and a slew of customization options to go along with it! + #gamedev #indiedev + +![https://twitter.com/ValerADHD/status/1350438404593369094](media/1_16_2021.gif) + +*gardener's note: I made Screenshot Saturday my bitch.* + +*Not really. I did consistently look forward to it--it was my one chance to get recognition outside of the #pico8 community, which was great for the little like-chaser I was. I did solidly.* diff --git a/twitter/tweets/1_17_2021.md b/twitter/tweets/1_17_2021.md new file mode 100644 index 0000000..3c40639 --- /dev/null +++ b/twitter/tweets/1_17_2021.md @@ -0,0 +1,12 @@ +{{{ + "planted": "1/17/2021", + "repotted": "12/10/2021", + "nobreak": "true" +}}} + +* More work on the titlescreen! I've added a controls menu, which allows you to demo the control schemes. Here's the Keyboard/Mouse control scheme, but I'll be adding menus for each control type I implement (token gods be willing) + #pico8 + +![https://twitter.com/ValerADHD/status/1350902043385470985](media/1_17_2021.gif) + +*gardener's note: I clearly love working on polish before anything else is done. It did make a really cool gif though--and you can see the fucked control system that Pico-8 defaulted to where the player 2 control scheme is ESDF instead of WASD.* \ No newline at end of file diff --git a/twitter/tweets/1_27_2021.md b/twitter/tweets/1_27_2021.md new file mode 100644 index 0000000..15229f9 --- /dev/null +++ b/twitter/tweets/1_27_2021.md @@ -0,0 +1,12 @@ +{{{ + "planted": "1/27/2021", + "repotted": "12/10/2025", + "last_tended_to": "12/10/2025", + "nobreak": "true" +}}} + +* I've reached the point in the project where I'm rewriting code I wrote weeks ago because I've decided it's not up to standard...🤦‍♀️You're just going to have to trust me that the editor code was especially egregious, and as a side effect you get neat gifs! #pico8 #gamedev #indiedev + +![https://twitter.com/ValerADHD/status/1354414605028761600](media/1_27_2021.gif) + +*gardener's note: This rewrite was definitely inspired by [PicoCAD](https://johanpeitz.itch.io/picocad). The old code wasn't great, but I was mostly chasing new features. [Johan Peitz](https://johanpeitz.com/), the creator of PicoCAD (who went on to do many other cool things) also commiserated with me on editor rewrites.* \ No newline at end of file diff --git a/twitter/tweets/2_7_2021_1.md b/twitter/tweets/2_7_2021_1.md new file mode 100644 index 0000000..f19de80 --- /dev/null +++ b/twitter/tweets/2_7_2021_1.md @@ -0,0 +1,16 @@ +{{{ + "planted": "2/7/2021", + "repotted": "12/10/2025", + "nobreak": "true" +}}} + +* If I'm going to have datacarts, I might as well have a little fun with them😉 + #pico8 + + + +*gardener's note: I wasn't able to find the original .gif for this one :( I embedded the compressed twitter video, hopefully I'll fix that eventually. This tweet is also a great example of the rapid scope creep of this project--can't be bothered to fit levels into the original cart? just put them into a new cart (parts of Pico-8 memory persist on cart loading--so you can create "datacarts" that just read a bunch of data from their spritesheets/maps/memory into that persistent area and reload the original cart). I wrote a whole compression/decompression tool to do it too.* + diff --git a/twitter/tweets/2_7_2021_2.md b/twitter/tweets/2_7_2021_2.md new file mode 100644 index 0000000..d3f11ff --- /dev/null +++ b/twitter/tweets/2_7_2021_2.md @@ -0,0 +1,11 @@ +{{{ + "planted": "2/7/2021", + "repotted": "12/10/2025", + "nobreak": "true" +}}} + +* a total aside from the map editor - wall textures are mapped onto the 3D walls and then projected back into the camera, which means it's actually a big optimization to have efficient frustum culling. Here's a little visualization of that #pico8 + +![https://twitter.com/ValerADHD/status/1358575055693897734](media/2_7_2021.gif) + +*gardener's note: This is the gif that I always end up showing people whenever I talk about this project. It's not an especially cool gif or anything, it's just the first one that shows up as I scroll down my old timeline.* diff --git a/twitter/tweets/5_27_2022.md b/twitter/tweets/5_27_2022.md new file mode 100644 index 0000000..acffe40 --- /dev/null +++ b/twitter/tweets/5_27_2022.md @@ -0,0 +1,13 @@ +{{{ + "planted": "5/27/2022", + "repotted": "12/1/2025", + "nobreak": "true" +}}} + +* Messing around with Vectrex style graphics in 3D- hopefully more to come! + + #gamedev #madewithgodot #pixelart + +![https://twitter.com/ValerADHD/status/1530366197388218368](media/5_27_2022.gif) + +*gardener's note: more was not to come.* diff --git a/twitter/tweets/5_3_2021.md b/twitter/tweets/5_3_2021.md new file mode 100644 index 0000000..bcc3cde --- /dev/null +++ b/twitter/tweets/5_3_2021.md @@ -0,0 +1,12 @@ +{{{ + "planted": "5/3/2021", + "repotted": "12/10/2021", + "nobreak": "true" +}}} + +* I'm not dead! I went through major burnout on my projects and programming in general, but I thought I'd share some long overdue progress! Here's a demo of some of my map editor's live editing features, which are meant to make it as smooth as possible to create content. + #pico8 + +![https://twitter.com/ValerADHD/status/1389233327962349569](media/5_3_2021.gif) + +*gardener's note: god this was such a pain in the ass to program. I ended up basing the architecture off of Blender's action system, but writing it in Pico-8 wasn't easy in the slightest. Didn't help that Blender didn't have much documentation on it either--ended up having to read a lot of source code. I'm sad this was pretty much where I stopped posting progress on this stuff--this was honestly the peak of my Pico-8 programming abilities.* diff --git a/twitter/tweets/6_19_2021.md b/twitter/tweets/6_19_2021.md new file mode 100644 index 0000000..3135b76 --- /dev/null +++ b/twitter/tweets/6_19_2021.md @@ -0,0 +1,43 @@ +{{{ + "last_tended_to": "12/10/2025", + "planted": "6/19/2021", + "repotted": "12/1/2025", + "nobreak": "true" +}}} + +* Keep your spell spinning and fight against the incoming giants in Spiral Spell: my first entry into #TweetTweetJam 6! You can find all of the code for the game in the replies, or play online at https://valeradhd.itch.io/spiral-spell +Have fun! +#pico8 + +![https://twitter.com/ValerADHD/status/1406271479969366021](media/6_19_2021.gif) + +

+pal({129,1,140,12,6},1)x=64y=x +r=48s=r +p=0q=0u=0v=0n={}t=30w=0 +::_:: +for i=0,999do +a=rnd(128)b=rnd(128)circfill(a,b,1,max(1,pget(a,b)-1))end +?w,1,1,0 +b=btn()u=b\2%2-b%2v=b\8%2-b\4%2X,Y=x-r,y-s +l=(X^2+Y^2)^.5X/=l +Y/=l +R,S=p-u,q-v +f=l*(R*X+S*Y) +U=X*f/35V=Y*f/35p-=U q-=V u+=U v+=V +t-=1x+=u y+=v r+=p s+=q +?"웃",x,y,0 +?"✽",r,s,4 +if(t<0)t=60c=rnd()add(n,{64+cos(c)*96,64+sin(c)*96}) +for m in all(n)do +X=x-m[1]Y=y-m[2]m[1]+=sgn(X)/6m[2]+=sgn(Y)/6 +if((X^2+Y^2)^.5<4)stop() +?"\^t\^w웃",m[1],m[2],5 +X=r-m[1]Y=s-m[2]l=(X^2+Y^2)^.5 +if(l<8)del(n,m)w+=1 +end +flip()goto _ +

+ +*gardeners note: when I was tracking down the original GIF for this one I discoved that I originally called the file "springballtweet". Thought this was fun, I was trying to recreate it recently and had fully forgotten it was a spring physics system.* + diff --git a/twitter/tweets/6_20_2021.md b/twitter/tweets/6_20_2021.md new file mode 100644 index 0000000..3d52f5a --- /dev/null +++ b/twitter/tweets/6_20_2021.md @@ -0,0 +1,39 @@ +{{{ + "planted": "6/20/2021", + "repotted": "12/1/2025", + "last_tended_to": "12/10/2025", + "nobreak": "true" +}}} + + +* Just finished my second submission for #TweetTweetJam 6! Fly a toy plane around a child's playroom in a demo written in just 560 characters. (two tweets!) +Play Plastic Skies at https://valeradhd.itch.io/plastic-skies, or by copying the source code from the replies below! +#pico8 + +![https://twitter.com/ValerADHD/status/1406658232463069192](media/6_20_2021.gif) + +

+j=0k=0⬇️=12➡️=0h=32l=0r=rnd +o=print +poke(0x5f2c,3)p=split("✽,------,__🅾️__,웃,●,●,★,-★-")c=split("6,8,2,10,8,8,2,2")::_:: +h+=(⬇️-12)/32l+=➡️>>10j-=cos(l)/30k-=sin(l)/30 +for i=0,999do +x=r(64)y=r(64)t=l+(x-32)/256 +if y>h then +d=24/(h-y) +u=j+d*cos(t)v=k+d*sin(t) +circfill(x,y,1,(u+v\1)%2>1and 10 or 12) +else +t-=1/8 +u=2w=h-12*cos(t%.25-1/8) +if(y>w)u=4 +u=t%.25<.03and 1 or u +circfill(x,y,1,u)end +end +b=btn()⬇️+=b\8%2-b\4%2➡️+=b\2%2-b%2for i=1,#p do +w=o(p[i],0,-9)x=32-w/2y=30+(i*⬇️-➡️*#p[i]/2)/16for j=1,#p[i]do +x=o(chr(ord(p[i],j)),x,y,c[i])y+=➡️/16end +end +flip()goto _ +

+ diff --git a/twitter/tweets/9_16_2021.md b/twitter/tweets/9_16_2021.md new file mode 100644 index 0000000..b2e71c9 --- /dev/null +++ b/twitter/tweets/9_16_2021.md @@ -0,0 +1,17 @@ +{{{ + "last_tended_to": "12/10/2025", + "planted": "9/16/2021", + "repotted": "12/1/2025", + "nobreak": "true" +}}} + +* My submission for the #Pico1K game jam: A game of snake played on a tiny voxel TV! It's simple, but it was a fun challenge to try and fit the voxel renderer *and* data into the small size limit. +Play it here: [https://valeradhd.itch.io/tiny-tv-snake](https://valeradhd.itch.io/tiny-tv-snake) + #pico8 #tinytvjam + +![https://twitter.com/ValerADHD/status/1438565091302019075](media/9_16_2021.gif) + +* Also, huge thanks to [@JadeLombax](https://twitter.com/JadeLombax) + for their amazing tutorial on sprite compression! this would not have been possible without it. https://lexaloffle.com/bbs/?tid=44375 + As well, [@TRASEVOL_DOG](https://twitter.com/TRASEVOL_DOG) + was a huge inspiration for both the #tinytvjam style and the voxel rendering! \ No newline at end of file diff --git a/twitter/tweets/9_20_2020.md b/twitter/tweets/9_20_2020.md new file mode 100644 index 0000000..bf8e1d2 --- /dev/null +++ b/twitter/tweets/9_20_2020.md @@ -0,0 +1,14 @@ +{{{ + "planted": "9/21/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* I finally decided to share my #pico8 raycasting engine I've been working on for about 2 1/2 weeks now! It's got support for various sloped walls, overhangs, sprites, and scripted objects. ~5000 tokens. + +![](media/9_20_2020.gif) + +* I want to eventually make this into some sort of arena-shooter, so I've been emphasizing fast movement. This has also forced me to code a precise collision system, which was probably the second hardest part of this engine. + #pico8 + +![](media/9_20_2020_2.gif) \ No newline at end of file diff --git a/twitter/tweets/9_21_2020.md b/twitter/tweets/9_21_2020.md new file mode 100644 index 0000000..081c8e4 --- /dev/null +++ b/twitter/tweets/9_21_2020.md @@ -0,0 +1,14 @@ +{{{ + "planted": "9/21/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* Teaching the new guy. + #pico8 + +![](media/9_21_2020.gif) + +* My player implementation was easily made portable, so I could add the infrastructure needed to allow for multiple controllable characters. With a little bit of cost-cutting (removing overhangs) I was able to get the CPU load under 50% and split the screen for local PvP! + +* This is just a branch of my project, so I am still working on a main singleplayer version! I may release this version standalone earlier, depending on how much I develop it. \ No newline at end of file diff --git a/twitter/tweets/9_22_2020.md b/twitter/tweets/9_22_2020.md new file mode 100644 index 0000000..0961ef4 --- /dev/null +++ b/twitter/tweets/9_22_2020.md @@ -0,0 +1,12 @@ +{{{ + "planted": "9/22/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* It's dangerous to go alone. Take this. + #pico8 (more below) + +![](media/9_22_2020.gif) + +* I've got a basic weapon framework going! now to make a big decision: should I try and implement a weapon arsenal similar to quake and doom (multiple weapons + switching anytime)? This is more difficult because the pico-8 controller only has 2 buttons, which are already mapped. \ No newline at end of file diff --git a/twitter/tweets/9_24_2020.md b/twitter/tweets/9_24_2020.md new file mode 100644 index 0000000..33e717c --- /dev/null +++ b/twitter/tweets/9_24_2020.md @@ -0,0 +1,12 @@ +{{{ + "planted": "9/24/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* He's a little confused... but he's got the spirit! + #pico8 (more below) + +![](media/9_24_2020.gif) + +* This one took a bit longer, but I've added an AI system! It uses a state machine similar to Doom (1993), which is currently very bare. Currently both the enemy (randomly moving around) and the bullets are being controlled by it. \ No newline at end of file diff --git a/twitter/tweets/9_26_2020.md b/twitter/tweets/9_26_2020.md new file mode 100644 index 0000000..e32eb87 --- /dev/null +++ b/twitter/tweets/9_26_2020.md @@ -0,0 +1,12 @@ +{{{ + "planted": "9/24/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* 6 full, uncompressed spritesheets loaded into a single cartridge, being swapped per-frame at runtime with only 7% CPU usage at 30fps! #pico8 + Explanation and code in BBS post: [https://lexaloffle.com/bbs/?tid=39745](https://lexaloffle.com/bbs/?tid=39745) + +![](media/9_26_2020.gif) + +*gardener's note: pico-8 has a single 128x128 16 color spritesheet typically available for use. If I remember correctly, it's packed into 4kb of data. I figured out how to pack that data into constant strings in the source code, then decompress it into Lua tables. Then, at runtime, I could simply load the table into the memory segment for the spritesheet and draw that. I used this in later game engines, and a similar technique is used in PooM for enemy and map textures* \ No newline at end of file diff --git a/twitter/tweets/9_30_2020.md b/twitter/tweets/9_30_2020.md new file mode 100644 index 0000000..75174a2 --- /dev/null +++ b/twitter/tweets/9_30_2020.md @@ -0,0 +1,15 @@ +{{{ + "planted": "9/30/2020", + "repotted": "1/4/2026", + "nobreak": "true" +}}} + +* Inspired by the recent release of the [teaser for PooM](https://twitter.com/FSouchu/status/1310142005482266624), I thought I'd dust off my basic attempt at my own DooM style renderer. Not quite as impressive, but it's a start! This is just a side tangent though, so I probably won't do much more on this for a while. + #pico8 + +![](media/9_30_2020.gif) + +* Also, this renderer is closer to Duke3D's engine than DooM. Maybe I'll do a remake and call it "Puke Nukem 3D"... err, maybe not. + #pico8 + +*gardener's note: this was such a pain in the ass. I based this engine almost solely on [this YouTube video](https://www.youtube.com/watch?v=HQYsFshbkYw). Implementing the depth buffering to do front-to-back rendering was way harder than expected.* \ No newline at end of file diff --git a/twitter/tweets/tweet_template.md b/twitter/tweets/tweet_template.md new file mode 100644 index 0000000..73c6c51 --- /dev/null +++ b/twitter/tweets/tweet_template.md @@ -0,0 +1,7 @@ +{{{ + "planted": "", + "repotted": "", + "nobreak": "true" +}}} + +* \ No newline at end of file diff --git a/twitter/vectordoom.md b/twitter/vectordoom.md new file mode 100644 index 0000000..8f75d89 --- /dev/null +++ b/twitter/vectordoom.md @@ -0,0 +1,77 @@ +{{{ + "title": "Vectordoom Tweets", + "status": "repotted", + "planted": "12/10/2025", + "allow_inline": "true" +}}} + +[[twitter__tweets__12_2_2020]] + +--- + +[[twitter__tweets__12_3_2020]] + +--- + +[[twitter__tweets__12_4_2020]] + +--- + +[[twitter__tweets__12_5_2020]] + +--- + +[[twitter__tweets__12_6_2020_2]] + +--- + +[[twitter__tweets__12_8_2020]] + +--- + +[[twitter__tweets__12_11_2020]] + +--- + +[[twitter__tweets__12_12_2020]] + +--- + +[[twitter__tweets__12_13_2020]] + +--- + +[[twitter__tweets__12_18_2020]] + +--- + +[[twitter__tweets__12_20_2020]] + +--- + +[[twitter__tweets__12_29_2020]] + +--- + +[[twitter__tweets__1_16_2021]] + +--- + +[[twitter__tweets__1_17_2021]] + +--- + +[[twitter__tweets__1_27_2021]] + +--- + +[[twitter__tweets__2_7_2021_1]] + +--- + +[[twitter__tweets__2_7_2021_2]] + +--- + +[[twitter__tweets__5_3_2021]] + diff --git a/updates.md b/updates.md new file mode 100644 index 0000000..cef98ce --- /dev/null +++ b/updates.md @@ -0,0 +1,16 @@ +{{{ + "title": "Recent Updates", + "planted": "1/15/2026", + "last_tended_to": "2/10/2026", + "status": "growing" +}}} + +- (2/11/2026) Edited the previous update to remove the link -- that page had too many thorns to be the latest thing I've posted. Might edit it and repost later. +- (2/10/2026) I for sure forgot to update this page -- I feel like I've definitely posted here between today and the last update. I braindumped a new page on how hyperfixations affect me. Be warned, it's a lot rougher than most of my other work. +- (1/27/2026) I decided to spend a little time tonight doing a quick first revision of my morning writing. I've also finally connected a page I've been "secretly" writing for a few weeks now to the rest of the garden through "[A few scattered thoughts](?scatteredthoughts)" +- (1/27/2026) I wrote another thing on the bus! About how I'm "[finishing things](?finishing)". +- (1/15/2026) Procrastinating on doing the things I need to. I improved a bunch of styling and added more information to my [architecture page](?architecture) about how this website works. Also, spun the "recent updates" section into this page! +- (1/12/2026) Added an [about me](?webmiss) page! and I'm officially a [resident of neocities](https://neocities.org/site/terminallesbian) :O +- (1/10/2026) I made the site interactive! Check out my [guestbook](?guestbook) -- please don't break it. Also, peep the visit counts at the bottom of each standalone page >:) +- (1/5/2026) Wrote up a [new article](?cyberspace) on my bus back to work +- (1/4/2026) Happy new year! I finished [repotting](?repotting) all of my old [tweets](?valeradhd) and reorganized the garden. \ No newline at end of file diff --git a/valeradhd.md b/valeradhd.md new file mode 100644 index 0000000..c608c34 --- /dev/null +++ b/valeradhd.md @@ -0,0 +1,48 @@ +{{{ + "title": "Twitter ([@ValerADHD](https://twitter.com/ValerADHD))", + "status": "sprout", + "planted": "12/10/2025", + "last_tended_to": "1/4/2025" +}}} + +Back in 2020-2021 I had a Twitter account I posted on frequently for game development. At the time I was hyperfixating on the "Fantasy Console" [pico-8](https://www.lexaloffle.com/pico-8.php) and was using it to make a ton of things. Most of my tweets revolve around that--it had an amazing (now migrated) community in the #pico8 tag which was super welcoming. I thought it'd be nice to have a better organized and more trustworthy than that seedy old website. I'm still working on "repotting" everything, so this isn't a full repository yet. + +--- + +## Vectordoom + +--- + +While I never called it that when I was posting about it, "Vectordoom" is one of my favorite projects I've ever worked on. It inspired the styling of this page and quite a few other unfinished projects. I'd like to finish it at some point, but I'm not much of a "game" developer. I've collected everything I tweeted about it and added some comments where I thought it would be interesting. I hope to eventually write more about this--there's a lot that wasn't shown in these. +* [Vectordoom Tweets](?twitter__vectordoom) + +Vectordoom was based on previous work I had done implementing a "Duke Nukem 3D" style 2.5D portal-renderer in pico8, which I like to call: +* [Puke Nukem 3D Tweets](?twitter__pukenukem) + +--- + +## Quiver Engine (Wolf3D raycasting) + +--- + +The first big project I did in Pico-8 was a Wolfenstein 3D style raycasting engine. It started small and then kept growing as I figured out how to do more complicated rendering techniques in it. There's way more that I never tweeted about that I'll have to write up someday. The "Quiver" name was some bullshit I thought of when I was implementing quake-style movement. +* [Quiver Engine Tweets](?twitter__quiver) + +--- + +## TweetCarts / Code Golf + +--- + +"TweetCarts" are a form of code-golfing where you attempt to fit the entire source code for a pico-8 demo in 280 unicode characters. I got really into it, and other pico-8 code golfing competitions like TweetTweetCarts (580 chars) and the Pico1K jam (1024 chars). The code was initially included as replies, but I decided to format it nicer for the site. +* [TweetCarts](?twitter__tweetcarts) + +--- + +## Miscellaneous + +--- + +I also worked on a bunch of random little projects that I posted snippets of. I've collected them here: +* [Miscellaneous Tweets (in progress)](?twitter__misc) + diff --git a/webmiss.md b/webmiss.md new file mode 100644 index 0000000..5d5166a --- /dev/null +++ b/webmiss.md @@ -0,0 +1,24 @@ +{{{ + "title": "About the [WebMiss](?whatisawebmiss)", + "planted": "1/11/2026", + "status": "seedling" +}}} + +Hi! I'm Val--a.k.a terminallesbian--and this is my website! I'm a software engineer with dreams of ~academia~ computer graphics research. I've been programming as a hobby for 8ish years now, but since it's currently my job I wanted to program this site in as stupid of ways as possible (so don't expect things to work 100% of the time). Here's a few things about me! + +--- + +### Hobbies + +--- + +With time I'm not forced to spend doing *work*, I like to knit, read, do origami, play games, and occasionally program poorly "on purpose". Eventually, I'd like to put some of the things I've made on here so I can have cool hyperlinks to each of those list items. + +--- + +## Contact Me + +--- + +I'd love to talk with you about things I've put here! You can reach me at +* valis@hotn.gay diff --git a/whatisawebmiss.md b/whatisawebmiss.md new file mode 100644 index 0000000..ecabb38 --- /dev/null +++ b/whatisawebmiss.md @@ -0,0 +1,11 @@ +{{{ + "title": "What in the world is a WebMiss??", + "status": "seedling", + "planted": "1/12/2026" +}}} + +A "WebMiss" is a feminine form of "WebMaster", which feels (to me) less high-and-mighty. And it's funny. + + +I discovered this term the day I decided to write my ["about me"](?webmiss) page on a [wonderful 404 error page](http://fan.warmer-climate.net/portal2/about.php) (though please don't hassle that webmiss) +