the web log of ~vilmibm
back to my home page
rss feed, ass feed
In Pattern Recognition, William Gibson coined the term “soul delay.” It describes the sensation brought on by jet lag of your physical self being in one place but your inner self feeling distantly stretched somewhere far away. Your inner self is drawn back to you, slowly, as you adjust to being in some far away time zone.
I don’t think jet lag is the only way to experience soul delay, though. I’m 11 days past TOWN CON 2024 (though publishing this post much later) and feel like my inner self is still behind me, somewhere, mingling in that venue with townies. In fact, it doesn’t just feel like soul delay, but like an entire soul effects line. Perhaps soul distortion, then soul delay, then finally a shimmery soul reverb.
I’m not complaining. However, I need my soul to snap back in so I can focus on other things (chiefly, a pretty rough time at work). I feel this beckoning backwards to think on TOWN CON and process it in the hopes that it pulls me back into myself.
background
TOWN CON was not the first physical meetup for townies. There have been regional get-togethers and one on one meetups intermittently since town’s inception. This was the most official and, as far as I know, the biggest event of its kind. I’d been kicking an idea back in forth in my head about maybe organizing some online thing to celebrate the town’s tenth birthday throughout 2023 but was largely incredulous that it would be a success.
Then, the topic came up on our mailing lists–people wanted to do a conference.
Seeing such an event come up organically on the server fueled me. I talked it over with my wife with whom I’ve run significant events (Code For Good once and Django Girls workshops several times, not to mention our wedding) and she was enthusiastic about the idea.
Ever the coward, the support of my wife and internet friends was what I needed to bolster me into saying TOWN CON was real. I announced it with no firm plans but the will to see something through.
My initial vision was to compute the airport closest to the geographical center of the continental USA and book its hotel for us. Normalize the borders into a rectangle, find the actual middle of nowhere. I saw us all inhabiting the drab, musty convention center of a probably Nebraskan airport. We’d create something beautiful there in defiance of the great gray ghost filled chambers which were certainly not designed for a community like ours to use for celebration.
This particular notion didn’t last long. I imagined sitting on scratchy furniture picking the meat out of an uninspiring sandwich in the yellowed light of a cut glass chandelier. No–I wasn’t ready. I wasn’t up to it. I wanted to feed us all nice food.
Toward the end of 2023 my wife and I learned that she had been extended the offer to do an internship in a suburb outside of Chicago. There was our location. Chicago is well connected by air, rail, and highway and covers a huge geographical area. I made a more detailed announcement about the event and started the important work of anxiously procrastinating acquiring the actual venue.
~spinecone, who recreationally looks at housing, volunteered to pick something out with me. We first had the idea of getting a big suburban house not far from the O’Hare airport. I wanted to recreate a 2010s style “happy hacker house” environment which seemed to necessitate a house. We picked out a beautifully hideous McMansion but in going over the house rules saw one about how wearing shoes inside was “absolutely forbidden” and if evidence of shoe wearing was discovered bad things would happen. We moved on.
The ultimate venue was a converted warehouse called Loft 606–not in a suburb, not next to an airport, and not a drab spartan place for us to rebel against. I caved to the big, communal space and the convenience of being in the city proper for things like food and sundries.
I just had to plan an event, now. I had a lot on my mind:
- what kind of event even is this?
- is this a tech conference?
- oh god do i even like tech conferences anymore?
- are we a technical community
- what would an artist squat do?
- how to include people not coming to the physical venue
- how to ensure people who came from far away felt it was worth the trip
- some kind of schedule to make it a real event
- quiet spaces for people to calm down in
- noisy spaces for people to party in
- where everyone’s going to sleep
- how to organize information about and for attendees
- what the hell are we doing
- what the hell is tilde.town
- twenty people said they wanted to come in person
- they’re all going to look at me
- there is going to be a moment when twenty well intentioned far traveled people all turn and look at me for direction, guidance, or assurance and in that moment I might not know what to say and I will just have to avert their gaze and exit the building and walk until I reach Lake Michigan and then stare at Lake Michigan whose ebbing and flowing will proceed with or without me and whose depths teem with safely forgotten things I can contemplate as I try to imagine myself safely hidden inside a lake cosplaying as an ocean
I had collected initial, tentative, water testing interest in TOWN CON via a Google form. For actual, real RSVPs I wanted to be able to tie people’s form submissions indelibly to a user account on the server. I’ve made plenty of TUI forms so I figured I’d make a new tool to track who was coming in person and to disseminate information about the event.
I decided to use the tool as a gathering mechanism for proposals, as well. I did want people to be able to submit “talks” like you might find at a tech conference (say, PyCon or RubyConf) but, given that I think of the town as an artists’ squat more than a user group, didn’t want people to just submit talks. I also didn’t want a fully synchronous schedule of live content that would be hard for people across timezones to attend.
In the lead up to TOWN CON I dusted off the current version of my now years-old attempt at making my own MUSH. I had grand plans of finishing it in time and then modeling the physical venue in the virtual world to thin out the veil between meat and cyber. This did not come to fruition; however, thinking in this way did lead me to the idea of a virtual art gallery. I’d take whatever people submitted and slot each thing into a “viewing period;” some of these things would be live talks, but they’d get scheduled alongside of things like writing and music and software.
I’ve never heard of or attended anything like this but it felt right. Thus, the town con
command on the server could give you information about the event and accept an RSVP or submission. I’m quite pleased with how that worked out. The tool emailed me form inputs and I manually added each thing to a spreadsheet for further processing.
I had grand plans for the people coming in person. We’d go out in nature or take a big school trip style outing to a museum. I’d have it all planned out with transportation. This didn’t happen. I couldn’t really design the perfect outing and I figured a bunch of seasoned computer touchers would not all be on the same page at the same time about going out into the sun squinting world of loud meat together. So I thought of a few options that didn’t require much advance planning and left it for the day of.
Similarly, I mapped out an elaborate catering plan. The only remnant of this to survive was the deep dish pizza night on the 11th. I felt like I was failing; but in retrospect this was the right call. TOWN CON is about celebrating creativity, chaos, and diversity. Railroading us all into a set schedule with meal times would have been inappropriate.
day 0: humans appear
The first human to appear came early on the 10th: ~kingcons. ~kingcons is not a very active member of the town itself but is both an old friend of mine and active on tiny tilde website. The thing about ~kingcons is that he is relentlessly dapper. True to form, though sleep deprived and subject to much air and bus travel, my friend appeared at my place in a tasteful linen blazer and his signature, infectious, glowing Cheshire smile.
We dug in and rambled and reminisced as I pushed on con prep. I stood at my kitchen island and delivered my hastily written keynote for the assessment of ~kingcons; without it, it would have been a far weaker talk. A truly satisfying and fortuitous beginning to the event, I decided.
The next arrival was ~m455. It was my second time meeting him in person. ~m455’s is a soothing presence. He is supportive, kind, attentive, and liable to bring me delicious Sichuan snacks. The three of us loaded up my car and we drove to the venue.
A major factor in the selection of the venue was the massive disco ball suspended from the ceiling of the main room. Its controls were inscrutable but after prodding and begging and cajoling the sphere began to slowly spin. Success. Everything else could fail, I thought, as long as the disco ball doesn’t stop spinning.
~kindrobot, ~ivycreek, and ~archenoth all arrived as the evening wore on. ~m455 bravely climbed furniture to flip a set of curtains around and make a white screen for projecting on. We put IRC up and ~nebula entertained us with ascii art.
Even though I did not manage to complete my MUSH project in time I still wanted some kind of connectivity between the cyber and meat parts of the event. My brain clumsily combined some ideas that have been sitting in the back of my brain fridge since I wrote up the patreon “rewards” for tilde.town’s funding. One of them was a fully terminal/ssh based teleconferencing solution for the town. I’d idly designed some combination of asciified video and text chat but never followed through. Since shelving that, though, there have been significant advances in both asciify’ing video and in automatic voice transcription.
I successfully prototyped the local ascii-fication of a video feed combined with voice transcription using whisper.cpp
. Being all text in a terminal, I realized I could use netcat
to shunt it all onto town. Users could then watch over SSH by attaching to a read-only tmux session with panes set to receive the netcat
output.
I’m still astonished it worked as well as it did.
~kindrobot, in a true demonstration of their eponymous kindness, schlepped a desktop computer all the way from Canada and helped me recreate my prototype. Since I wanted cyberfolk to be able to call in and talk, the setup ended up like this:
- a Google Meet call
- a desktop dialed in to the call
- OBS running on the desktop, recording the browser window with the call
- a virtual camera created by OBS
- the program
tplay
reading the virtual camera and converting it to grayscale ascii
- a pipe from
tplay
to netcat
- an M3 macbook pro with a nice microphone and a webcam attached also on the call
whisper.cpp
running on the macbook listening to the microphone
- a pipe from
whisper.cpp
to netcat
- a script on town called
watchcon
that attached read-only to a tmux session
A beautiful contraption and one so precarious and fragile there’s no way I could have done it without ~kindrobot’s help. It’s possible this ended up being no more than a novelty–anyone really desiring to see live talks called in to the Google Meet call. For me, it was a very town appropriate centerpiece to the event. It was also fertile ground for future text based teleconference inspirations.
In a running theme for the event, I realized that night was approaching and I hadn’t eaten in something like seven hours. As if bearing manna from heaven, ~kindrobot and ~ivycreek appeared with burritos. I consumed the food tube like a bank drive through inhaling a plastic pneumatic vessel.
More people arrived: ~signalnine, ~noelle, ~grendel84.
Townies settled in for a night of, I assume, playing a lot of smash on ~kingcons’s Wii. I thought I would need to sleep back at my place due to car logistics but was able to work things out with ~spinecone such that we could return and stay the night at the venue. I’m glad that worked out and thankful to ~spinecone for adjusting her commute during an intensely busy week at work.
day 1: 11
Nightmares. Vivid and real. In my dreams I woke for the con. Somehow, over a hundred people had shown up while I overslept. They packed the venue and had brought kids, dogs, cats, piles of food, boomboxes, picnic blankets. They all looked at me. I struggled to get the A/V setup together and kept forgetting what time it was or what was supposed to happen first. Pockets of rebellion erupted into their own miniature conferences. A dozen simultaneous talks began. I was so hungry and tired and didn’t know if I wanted to be looked at or forgotten in this sea of strangers and their kids and their dogs and their cats.
I woke up for actual real and things were quiet and fine. I wanted to be able to provide something for breakfast and went to Cafe Umbria down the block with ~spinecone. We arrived just as they opened and got boxes of coffee plus a big box of pastries. ~spinecone went on to work and ~m455 and ~grendel84 appeared to help me get objects back to the venue.
We started on time. I improvised some opening remarks and did not think to record them. The main thrust was that TOWN CON was not supposed to be a one-to-many event but a many-to-many event: a maximally connected, cyclic graph of community and collaboration. I encouraged people to get in front of the webcam as desired and talk to other townies online or off.
Unless I have carefully excised it from my spotless mind, nothing really went wrong. We did decide to give up on the projector–turns out a massive skylight makes any kind of daytime projection impossible. The A/V setup rotated to the TV mid-day in time for live talks. I updated the topic for #con
in IRC as viewing periods for works went on. There were last minute changes to the schedule but nothing too serious.
Once again, I found myself at a meal time on a cavernously empty stomach and once again ~kindrobot and ~ivycreek appeared with tubular alimentary salvation (though subway sandwiches this time instead of burritos).
I gave the first live talk: a survey of tooling I use to administer the town. It also occurred to me to show off the current state of my MUSH lest anyone (fairly) disbelieved that I had actually made a bunch of progress on it. ~kingcons and ~m455 spoke about identity, life paths, and computers.
Townies arrived throughout the day: ~hush, ~polyrtm, ~duckbilledwren, ~mikewilsonstl, ~spinecone, ~insom.
I gave my keynote and cried less than the two times I practiced it.
The big catering order was supposed to have been delivered but the restaurant decided they “couldn’t get anyone to do it” despite being a mile away (and promising delivery). I sent two very brave townies into the waning light to acquire our massive pile of deep dish pizza: ~grendel84 and ~archenoth. They were not unscathed in the endeavor but succeeded none the less.
We ate; it pleased me to perform the cultural ambassador task of introducing people to giardiniera and deep dish (they already got into the malort the night before).
~spinecone had appeared bearing two surprise cakes and celebratory candles to go with. One was for the town (chocolate) and one was for me (carrot). We sang happy birthday to the town and all blew air symbolically at the candles. It was very cute.
We had our last live talk (by ~spinecone and sadly only partially recorded because I plugged in the camera wrong). I shut off the A/V at 22:00. I probably did closing remarks. I can’t remember. We chatted and wandered and whorled. People constructed badges out of the dead media and crafts ~spinecone and I had assembled. Music was made and people played games.
Of special note was the joy of getting to hear ~m455 and ~mikewilsonstl both playing acoustic guitar.
My final fret for the night was making sure ~nebula could make it in late with both a parking spot and a place to sleep. ~duckbilledwren graciously went and unblocked the venue’s parking spot by helping me push a big dumpster out of the way. It felt like a puzzle from The Last of Us. ~spinecone discovered a cache of air mattresses and we set up a bed.
I slept, and with far fewer nightmares.
day 2: is this an arboretum?
Saturday the 12th had no cyber component and was a day for the in-person attendees of con to do whatever they felt like. Pastries appeared once more from Cafe Umbria as well as not just a box of coffee but one of their actual, branded coffee urns. I know ~m455 was involved in that adventure because he joked that he stole it (thanks to whoever else helped with that!).
I did some loud dad yelling to get everyone informed about options for the day. We ended up coalescing around:
- a field trip to the arboretum
- a field trip downtown to see the bean
- just chilling at the venue.
I really needed to see some trees and helped lead the arboretum expedition. Two car loads of townies (thank you ~noelle for driving car #2!!!) headed to ~spinecone’s place of work in a far flung suburb.
The trees were good. Many people learned what an arboretum is for the first time. We learned first hand that ~m455 has a secret talent for improvising completely fake yet utterly convincing latin names for plants. Ask him to identify a plant sometime.
I hear the bean was good, too. A week later, I went out for a bike ride and found myself there staring at it. ~insom said he appreciated the bean; that it was at once a familiar thing (a mirror) and yet a very confusing thing since it was hard to find yourself reflected in it. I stood for a long time at the bean unable to find myself and instead looking at the reflection of the assembled tourists mobbed closer in. I found a new appreciation for the bean.
By Saturday evening I was quite tired. Not unhappy; just naturally exhausted. I couldn’t quite focus on smash or music jamming or programming and just floated from human cluster to human cluster. I stood alone for a bit and just listened. People were talking, laughing, making pretty sounds, tapping on keyboards.
It was exactly what I hoped for and I wish it was still going.
day 3: bye
I woke on the 13th to find that people had already done a tremendous amount of cleaning and prep for our departure (thank you :’)). We wrapped up without issue and resolved to have a final brunch before dispersing. This was somewhat unwise, though I probably would think that less if while waiting for my food to appear I didn’t panic about a surprise reboot of the town being a possible security event. I was too exhausted to think and had a rough day after that, but by the evening we were all good. It put a pallor on the final moments of con and I regret that. I got a good ~m455 hug before he went to the airport, though.
so
~spinecone, at some point, described TOWN CON as feeling “like college except I like all of these people.” I agreed. Communal existence, with the right set of people, is an immensely satisfying thing. I’m so grateful to everyone who gave it a chance that weekend in person and to everyone who hangs out on town doing it digitally. I’m so grateful to all the people who jumped up to help out and volunteer throughout the event.
I talk about it in my keynote, but originally TOWN CON was going to be a chance for me to announce my retirement from running tilde.town. However, in the lead-up to the event, the idea of retirement vanished from my mind. Not only can I imagine departing this community, I can’t imagine not having another con in 2025, too.
I hope to see y’all there.
Today I am releasing Trunkless, a new web based soft ware for creating cut-up poetry from 1,267,620,693 possible phrases extracted from large quantities of thematic text.
At launch, I’m offering five corpora to play with:
For now you can only work within one corpus at a time. I’m open to adding new corpora. Send me an email or open an issue on github to chat about it. You can also, of course, get Trunkless’s source locally and add your own corpora.
Background
I left high school in the 2000s with the fervent desire to be a writer. Fear of poverty and a sense of alienation meant I was thinking about how to support myself from the first moment I picked which college classes to take. Because I had expressed interest in some amount of computer science study, I had been assigned a computer science professor as my advisor. I remember going over the list of classes and nervously signing up for every computer class I could. Even my CS advisor questioned my logic. I brought this fear of eventual employability into every class registration meeting and he brought a soft resistance that stood no chance. I contend that some amount of this fear is healthy for anyone attending a liberal arts college. I, however, regret my excess.
For my senior year of college I did a thesis. Despite my nervous insistence I take all the computer science classes I could take, I still rebelled against the idea of being a programmer and even a computer scientist. I did not want to do a “traditional” computer science thesis. I wanted to “make art,” whatever that meant. I did not want my thesis to wear a tie (which was something I didn’t yet know programmers didn’t do).
William S. Burroughs was a great inspiration to me throughout high school. His cut-up technique lit up my brain and led me to appreciate aleatoric art in general. My brain didn’t work so well and applying chance to the creative process was a way to get somewhere with art when my mind wasn’t cooperating.
Throughout college I was a performing noise musician. I did a lot more composition than might have been obvious at my shows, but within the structure of a performed work I did a lot of improvisation. I followed the lead of feedback and samples and the random slamming of effect pedals. I had been making bots on this early “twitter” thing that smashed search results for random words together, slicing up text without reason. I used text manipulation to generate flyers for my campus radio show, DEAD AIR. All of this led me to my thesis proposal: what if William S. Burroughs had not scissors, paper, and paste–but a computer?
I remain proud of my thesis these many years later, arrogant and smug though it was. The code was clumsy and full of bad decisions. Still, I used it to create some pieces I liked. I presented my thesis (it’s on youtube sliced up into 10 minute chunks as all youtube videos were at the time. I will leave finding it as an exercise to the reader).
I kept coming back to this software throughout the years. This used to embarrass me. Only a loser keeps making the same work of art over and over, I told myself. Why not make new, radical things? As I matured I noticed several examples of artists I deeply respected seeming to iterate on the same basic piece over and over. William Gibson is a good example: each of his novels is different, but think about them enough and you’ll find the same essential themes. In the 1980s Gibson took a big bite of some meaty ideas and today he is yet chewing on them. We are lucky to snuffle out the crumbs that fall from his wit-wet lips.
I transmuted my shame into pride and, thus, now present to you the latest iteration of the cut-up poetry software I have been chewing on since 2009: Trunkless.
The stages of growth that got us here:
- Weltanschauung, 2009 (perl)
- node-prosaic, 2012 (coffeescript, though a custom dialect inspired by haskell. yes, it’s completely terrible)
- hy-prosaic, 2014 (hy, with a code structure inspired by the cthulhu mythos. i can’t explain this now)
- Prosaic, 2015 (python)
- prosaic.party, 2015 (a web based version of prosaic. it suffered from a terrible ux, memory leaks, extremely slow performance)
- Trunkless, 2024 (go/javascript)
I did poetic work with each iteration. By Save Scum I had a consistent workflow of generating a dozen or so lines, copying and pasting the lines that stood out to me, writing some original “glue” lines, then generating new lines and looking for the final pieces to whatever puzzle was taking shape. Prior to Trunkless, I was fixated on the idea of “decaying templates” or “weakening rules” which I felt set my work apart from previous computer poetry tools. A user supplied prosaic with a line template like {"keywords":["sex", "love", "god"], "alliteration": true, "rhyme": "A"}
. Prosaic would search its database for phrases that exactly matched the template. If a match was not found, the template was “weakened” and re-run. To weaken a rule, prosaic would pick a random property and make it crappier: looser rhymes would be accepted or alliteration would be dropped, for example. Rules would be weakened until a line was found. During Save Scum, however, I found myself just using the “blank template” to get a truly randomized phrase. I would see a connective thread between two random lines and build a poetic narrative or picture around it.
This process felt like sculpting and I imagined myself at a pottery wheel, feeling the bumps on each random line and molding them into a coherent shape. A poetry wheel, if you will indulge my metaphor.
Trunkless’s interface
Trunkless is a radical departure from prosaic
and an attempt to crystallize the approach at which I arrived after working in this mode for well over a decade. Trunkless is also an attempt to share my approach with others in a low friction way. I have completely dropped the idea of templates: now you just get one random line out of a truly massive corpus. I’ve focused instead on the human-interactive parts of my workflow. Trunkless is the poetry wheel: sit, sculpt, share.
To get started with Trunkless, note what corpus you are working with. It’s gutenberg
by default. You can pick a different one and hit go
to switch. See what lines you received from the æther. Each line’s source identifier is on the right side under the row of buttons. If you see lines you like, you can click the padlock button to lock it in place; it will enbolden. You can regenerate unwanted lines either using the per-line regenerate button or by clicking “regenerate lines” at the top; any unlocked line will be replaced.
If you want to trim a line’s content, click its edit
button. Once you are happy with changes, hit your enter
key or click the edit button again. Note that if the new version of the line is not a proper substring of the original line, the source attribution changes to original.
Delete lines with the delete
button. Add new lines at the end with add new line
. Any unlocked line can be reordered by clicking a line and dragging it to a new position.
When you have a piece you want to share or take elsewhere to edit further, you have several options:
- copy to your clipboard as an image
- copy to your clipboard as plain text
- save as an image to your computer
- save as a
.txt
file to your computer
In any of those scenarios you can include a listing of source attribution with the include sources
checkbox.
Technical Details
I used Go for all of the text extraction and for the web backend. The frontend is vanilla Javascript using web components. The only library I included on the front end is the very useful html2canvas, a tool I also reached for in the blackout engine.
Trunkless is written as a Go CLI application that exposes a few subcommands:
cutup
: cut-up raw plaintext files into files full of poetry ready phrases
ingest
: use files full of poetry ready phrases to create a corpus in the database
serve
: run the web frontend
I began this work with the requirement that a random line should always be retrievable in constant time. This was to allow me to embrace very large corpora and also make the “poetry wheel” approach to cut-up as pleasant as possible. There is no “get a random row” operation in PostgreSQL, so I evaluated two options:
- pre-generate an indexed, random value for every phrase row then query for a row closest to a randomly generated value over the same range
- give every row a sequential integer ID, cache the maximum ID value, then generate a random integer between 0 and the maximum ID value
I went with the latter approach. I typically would never rely on the assumption of gapless IDs but I was not building a traditional database schema. Corpora are synthesized; once generated, they are read only. I would only ever be regenerating them from scratch. I felt comfortable relying on gapless, sequential IDs and the approach worked quite well.
A major challenge was optimizing write speed when writing a corpus. I wrote sufficiently fast Go code to cut up and produce phrases from various sources but was getting bottlenecked when trying to insert all of the phrases into a table. This challenge led me to abandon the database I started with, sqlite3, and switch to PostgreSQL in order to take advantage of the COPY
operation which can achieve extremely fast table write speeds.
The basic unit of input for Trunkless is a plaintext file. The cutup
subcommand is pointed at a directory of plaintext files. By default, filenames are used as source identifiers. Every source’s identifier is hashed to use as a primary key in the database. cutup
does no database operations but instead outputs phrases cut from the source files to a new file of phrases per source. This allows for the cutup phrases to be QA’d manually or used for other purposes. Each phrase file is a tsv with its source identifier’s hash and the resulting phrase. A supplmental file, _title_index.tsv
, is also written for easy translation between the source identifier hash and source’s plaintext title while performing ingestion.
The ingest
subcommand creates a corpus from the pile of phrase files output by cutup
. Each phrase file is inserted via COPY
, allowing postgresql to write entire files at once into the corpus’s phrase table. It’s worth noting here that I commit another grave database sin. In the “real” world I would have three tables: phrases, sources, and corpora. Phrase rows would have foreign keys to source rows and source rows would have foreign keys to corpora rows. In my extensively pathological usecase, however, I can’t afford to do joining or queries more complicated than SELECT phrase FROM phrases WHERE id = 123
. So, how do I know which phrases belong to which corpora? I hash the corpus name as part of ingest
and create a phrase table for it with the hash as part of the table name. Then, when querying, I STRING INTERPOLATE the corpus name hash to select from its phrase table (yes, I defend against SQL injection). Judge me; I will cackle, just as I did after describing all of this to my software engineer wife one day.
“It’s fine,” I insisted.
“It’s definitely not fine,” she said. She’s right, of course, but this is art. Art shouldn’t be fine.
On the front end I have committed many more crimes which I will not enumerate here. It works well enough and I’m quite pleased with web components. I would have used vanilla JS either way since I think React is worse than MUMPS.
I’m running PostgreSQL in a very sqlite3 flavored way thanks to this guide a friend contributed to another one of my projects: Run a Little Postgres Without sudo.
Corpora
Initially, Trunkless was going to exclusively be based on Project Gutenberg just like the blackout engine. While working on the blackout engine, I was not able to get the entirety of Project Gutenberg’s English holdings and this gnawed at me (despite saying in the blackout engine’s announcement post that I would not let such things gnaw at me). Part of getting Trunkless going, thus, was once again throwing myself at getting the full Gutenberg corpus. I succeeded, though not without effort. I found Gutenberg’s catalog file: a massive CSV that lists every book in their collection. Sadly, this CSV has corruption that makes many (~10,000) rows unreadable. I composed bash
one liners until I cleaned up all the issues and uploaded a corrected CSV to the Internet Archive. Using this corrected catalog, I was able to use a mirror of Gutenberg to fetch all of the English language books. This resulted in a pile of 57,000 books. I’ve compiled and uploaded those files to the Archive as well. I hope this is valuable work for others to build on. There are other, similar compilations floating around out there but the most recent ones I found were several years out of date.
I cut all of Gutenberg up into a sqlite3 database and let tilde.town users play with an early Trunkless. It was well received. I really wanted additional corpora, however, and that desire led to a lot of the changes described above. I’m glad I did that work. Adding new corpora is now fast and easy. Some source files need more handling than others and the cutup
subcommand accepts a --flavor
flag to apply source-specific hacks like filtering out Gutenberg book headers and footers.
So
Exactly one year ago I mentioned via mastodon that I was breaking ground on a new poetry project. It’s satisfying to deliver on that given how in the past year some significant things happened in my life: departing github after five years, experiencing the unexpected death of my mother, moving across the country, starting a new job. This work had a lot of false starts and dead ends. I was going to simultaneously release a CLI version. I was going to allow custom corpora uploads and a public feed of cut-up poems. I wanted people to be able to mix and match sources to fine tune corpora and change the weighting of various sources. I wanted people to be able to pick a cute, custom frame and color scheme for their finished poems.
I didn’t do most of what I wanted. Given the year I’ve had I think that’s okay. I used to not finish creative projects because of all the things I felt I couldn’t get to. I realized that if you release a work of art to the world, the things you didn’t get to are only known to you. People can’t see what you didn’t do; they see what you did do. I hope you like what I did.
Tilde.town turns ten in october!
To celebrate, i’m planning a low key conference with both in person and digital components for october 11th and october 12th.
In person stuff will take place in Chicago, Illinois, USA.
If you are a townie reading this please do me a favor and log into the server, check BBJ for the town con post, and look for the call to action there to help me capacity plan for the event.
a walk in the dark, or, a brief diary on mental illness, or, spiders loom larger when one is glued to their webs
Sat Aug 3 07:40:13 UTC 2024
Tonight I had a proper walk about. I let my feet take me wherever they felt led to go from the Hammer museum back to my hotel. I did not give in to fear. I reached a place of peace. I thought about horror movies in the shadowy sculpture garden outside of the UCLA theater. I thought about horror movies as I was spooked by a woman standing among the sculptures for a photo opportunity. I was spooked because she stood very still with her back to me and I assumed with full innocence that she was a sculpture. She was not. I enjoyed the scare and welcomed the frisson. Earlier, as Force11 was ending for the day, I stood at my laptop. A man sneezed nearby. Another attendee was in front of me. The sneeze echoed around and the attendee yelped and jumped and grasped at their torso. It was genuine fear.
“I thought it was. I thought something terrible had happened,” they gasped.
The sneeze did not bother me as I was on the cusp of entering my place of peace. I think such a place is required to truly enjoy horror. Later, I walked down whatever dark path I felt like seeing. I reflected on a unfortunate experience with trespassing years ago–a misfire of my urban exploration hobby. I was doing something unwise in that moment that I regret doing and should not have done. However, it is equally true that (in my ignorance of my surroundings) I was doing something that I enjoyed: existing in dark, liminal, unmapped space. I have been on a collection mission to identify the activities that inspire joy in me. The list is short so far and I treasure each entry like an unearthed artifact from a dead, gilded age. “Quietly walking around a large unknown environment in the dark” is the most specific entry in the list so far but I am happy to have found it; I am also happy I can now acknowledge the error while appreciating its context (nota bene: i caused no harm or damage, i just wandered into somewhere i wasn’t supposed to be thinking it was somewhere else and got caught). Crossing the line into transgression had not been necessary to generate joy; it was a mistake. Historically, I have been unable to sort these feelings out from the intense shame and terror of having committed a mistake like that in view of authorities. The extent to which it was an honest mistake depends on how you scale clemency to levels of intoxication.
Returning to my hotel room, I had every good intention to sit and write by hand in my journal. I was tired, though (the wrist-wrapped self-surveillance tool says 16,686 steps), and the bed seemed inviting. My laptop also seemed inviting. Computers used to bring me joy in an easy and automatic way. While I am not prepared to add them without qualification to the new joy list I am comfortable saying that they have at least reached a joy probationary period. I feel at home on my computer tonight like I’m settling into a comfortable sweater. I have spent today and yesterday at a conference. Conferences are another thing I can remember finding joy in long ago. Since 2016, however, I can only recall them as disillusioning and disappointing experiences undone by my own paranoia and fear. This one felt good. Ironically it felt good in part because I kept my laptop handy and allowed myself to slip into cyberspace whenever I wanted to dip out of the world around me. I worked on slides (before my talk) or on code here and there (after my talk). I did meet several interesting people at this event but frequently needed to turn from the flesh world. Not hide; not flee; not smother; not escape; just shift away.
There is a longstanding daydream I have. I imagine that I am lying in my bed but my bed has been placed at the center of some kind of bustling activity. Usually I imagine the auction house where my dad worked for forty-some-odd years and where I and my siblings all worked while teenagers. On auction night there was constant motion: My dad, like a stage manager, instructed us movers what to get and where to stand. There was to be no delay in between the sales of lots. His directions were clear and sure. I felt like I was part of a dramatic engine, ticking away scenes with the exactitude of a pendulum. It was soothing to know exactly what my place was and what I should be doing. This informs my daydream. I would use it to fall asleep as a teenager. I would get home from auction nights with throbbing feet and buzzing, sore limbs. I would lie down and shut my eyes and still see the warehouse swirling with lots moving on and off stage. My role was to sleep, though. I was supposed to be in bed regardless of what swirled around me.
The daydream has since taken other forms. Most common is a busy intersection. I imagine my bed is at the very center of Shibuya crossing, for example. No one in the dream ever questions me or wakes me. Cars smoothly navigate around me. I am accepted as much as I am ignored. I’m not invisible – no one would ever crash into me in this daydream – but I am spared the torture of engagement.
Being around most humans is work. I toil in their mines. Most humans behave in ways I find inscrutable. I have to stare and study to find meaning in their smiles and winks and idioms and motions. Such things are without any a priori meaning to me. I am in any conversation as if I’m stroking the contours of the Lament Configuration: perhaps a way forward will open, but it will bring pain and pleasure indivisible. Such is socializing.
Today I realized my computer was my bed in the bustle of the conference. I felt like I was supposed to be there, jacked in, even as I was still aware of the fleshy commotion around me. In the early 2000s, when I was a teenager, my extended family still got together with regularity. I neither despised nor disparaged this. However, I could only handle so much of it. I did not know what to say to anyone. As soon as the material parts of dinner were over I would promptly get back on the family computer. It was situated at the open border between the living room and dining room (it still is, though with a 90 degree rotation). I can clearly remember the sensation of my family being around me. Like the auction daydream it was comfortable. I listened to and internalized conversations even though I was not engaging directly with them. I was on their fringe while my primary senses melded with the screen. It probably seemed rude. Perhaps my family didn’t notice. I don’t know.
My brain is injured. It is not damaged in a physical sense. Rather, I have been diagnosed with complex PTSD. The practical effect of this is my being sent into severe panic by innocuous triggers. Human memory, as I have experienced it since childhood, is a sublime graph (as a computer scientist, when I say graph, I mean a series of nodes connected to each other by lines like a subway map). I cannot intuit the boundaries of the graph. I can only traverse it from a node randomly accessed via sensory input. A smell might remind me of an autumn day on which I walked home from the bus stop with my neighbor from china who loved Jesus who died on a cross shaped like the “t” in “texas” which at one time was the farthest west I had ever gone in America which is a country where my stuff is. Each of these memories is a node; each sensorial or phantasmagoric overlap a line between them. PTSD means that some of these nodes are cursed. Being led to such a node means that my muscles lock, my throat tightens, my eyes dart and quiver, my focus explodes away like a family of frightened deer. Complex PTSD means that I have many cursed nodes each subtly pointed to in surprising ways.
Given this psychological premise, imagine what happens if a cursed node is also on the connective path to a node that I associate with joy: The joy becomes inaccessible. Sensory input that should result in joy results in panic. Luckily, this can be healed, though it is a long and torturous process. It requires traversing memories and accepting that some will inspire fear. When one does inspire fear, I have to proactively re-associate the memory node with safety and security. I have to climb into bed while the panic gesticulates around me. I have to open the laptop while the carnival of souls shuffles around me.
My two days at this conference have shown me that this healing proceeds and I write to acknowledge that such healing is worthy of celebration even if its pace feels glacial. If your brain is injured like mine I hope this is encouraging. If not, I hope this inspires empathy or at least curiosity.
Either way, I encourage you to gather yourself and go take a walk in a dark place.
my friend E sent me a link some weeks ago to a short youtube video about hauntology; specifically, cultural hauntology:
the video on youtube
The following is an e-letter to E I wrote out immediately after viewing:
I have been giving myself the brainspace today to catch up on my tab queue and finally watched that Hauntology video you sent me. I liked it a lot. I appreciated ending on the observation/question about how the nostalgia mining is clearly the result of a need people have as opposed to (victim) blaming the people partaking in it of being wrong/stupid. I think an argument “against” (not fully) the Fisherism of cultural hauntology is the assertion that all art (and thus culture) has to start in the past; it has to be a reaction to / conversation with the past. so I think this endless recycling is not a neoliberalism exclusive thing; I think neoliberalism has just capped how much imagination one can bring to the past/present conversation that is art.
I said in the preface to my cyberpunk cutup collection that I was (to steal phrasing from burroughs) cutting into the past as a kind of divination into the present in the hopes of then imagining and constructing an alternate future which I think all these years later is still the guiding principle of all my dives into the past (VHS, tilde.town, old books, etc). I butt heads all the time with people who just want to dig into the past for the past’s sake and I find it really troubling and I feel like that’s echoed well in the hauntology video
when I think about creating futures the most clear examples that jump to mind are 20th century revolutionary movements–fascism, sovietism, maoism. there are effectively infinite nightmares that occurred within/because of those movements and i often wonder if we’re collectively terrified that trying to dream up the truly new has to lead to immense suffering. neoliberalism with its short term commitment to big-tent-ism feels so safe even as long term it flings us into the apocalypse toilet. it leads me to think that all human attempts at organization are inherently deathward and the only real choices are ardent anarchism (short term localized suffering for potential long term chill) or continuing to sink into the neoliberal drug fog (short term pleasure(?) for long term disaster)
lately i have been feeling extremely TWO WOLVES as a result of my history research. one wolf is turbo anarchist, all states must be destroyed, all centralization of power has a greater cost than benefit; the other wolf is swooning for the visions of early communists (egalitarianism, science, atheism, frugality, collectivism, all wrapped up in a motherly state that can defend itself) and asking me to wonder “maybe this time?? maaayyybbeee this time???” even as i research the nightmare totalitarian end state of communist nations
(end)
I also linked the video in tilde town which spurred some good discussion. I reflected on hauntology, cut-up, and LLM “art” (reproduced below with other replies edited out):
22:02:05 @vilmibm | i think the video's perceived negativity is from mourning this
| seeming difficulty in imagining new futures
22:02:30 @vilmibm | what i said in my notes to a friend about it was that this video
| could observe that /all/ art starts in the past since all art is a
| reaction to what an artist has seen
22:02:56 @vilmibm | and what's changed is not starting out making art/culture based on
| the past but a newfound difficulty of taking that inspiration and
| making something new with it
22:03:09 @vilmibm | as opposed to just regurgitating it wholesale but in 4k or whatever
22:07:16 @vilmibm | personally the video hits at a creative concern near and dear to
| me: cutup poetry vs. LLM-generated "art". i think the level of
| human involvement in the former leads to taking the past (the
| content being cut up) and turning it into something new (ie meaning
| created through more than mere juxtaposition). meanwhile, LLMs can
| only autocomplete art
22:07:16 @vilmibm | that has already been made, offering novelty in terms of
| juxtaposition but never being able to rise above mere juxtaposition
22:07:42 @vilmibm | humans imbue cutup pieces with a new narrative; LLMs can only
| autocomplete old narratives
22:10:12 @vilmibm | whereas a human artist might be doing 90% pastiche but invent a
| whole new art form in that last 10%
22:10:30 @vilmibm | which to me is the thing most interesting about humans
reposting it all here in case it inspires conversation for anyone else. there are no comments here (YET) but there is always email.
a lonesome death needs not be
the only future for a life
lived as a tear wet
apology
(content warning: suicide)
I don’t know when I came across the memory palace technique but I thought it was interesting. I historically do not think of myself as a person with a “good memory” so I filed away this concept to try at some point. What ended up sticking with me and resurfacing was not the idea that a memory palace could help me memorize things but instead wonderment at the idea of building physical spaces in my head at all.
I first noticed myself creating such spaces in the early 2010s when I was groping at an understanding of my severe, suicidal depression. I had started obsessively journaling (in addition to therapy) in this detached and impersonal sense in order to see how my emotions fluctuated day to day. I started getting this notion of depression as a room I would wake up in with no windows and no doors–the lack of escape representing my obsession with suicide as the only means of dealing with my life. Realizing based on my journal/therapy that sometimes I was not in the doorless room was key to treating my depression. In other words–my brainspace could feel inescapable and I could feel incapable of remembering that any other type of brainspace existed but if I held onto there being places outside of the doorless room as an article of faith I could weather the worst depressive episodes (nota bene: though I still have the occasional depressive episode, the worst of my depression is years behind me and I do not experience suicidal thoughts).
Years later I was struggling to explain what the inside of my head was like to a new therapist. I ended up visualizing what the experience of having my consciousness felt like as a physical space like I had done years prior with the doorless room.
I remember two distinct visualizations. One was of sitting in a massive room surrounded by ropes that led off into the darkness. The ropes would twitch and I could follow one towards some idea but I end up with a bunch of ropes in my hand I can’t manage and would start dropping them. Once I drop enough I would be lost in the dark with no sense of self. The other visualization was of sitting in an armchair with a massive wall of TVs before me, all rapidly changing channels. I could try and focus on one but I would either be distracted by another or caught off guard by a channel change.
My therapist used somatic techniques to help me calm and focus; I ended up visualizing these, too. For example I would close my eyes and imagine the wall of TVs but also imagine whatever somatic distraction he had going–a candle, an aroma, a sound–in my consciousness too. I would imagine looking from the TV wall away at the distraction. The effect was to be aware of the TV wall “behind” me but focusing on the somatic distraction. This was super helpful and led to my being able to calm myself on a more regular basis.
I don’t remember when but at some point during the pandemic I was reflecting on how these room metaphors had helped so much with my therapy. I took stock of the various “rooms” that I had come up with and at this point was reminded of another interest of mine: MUDs. A MUD maps out a world in terms of “rooms” which have connections between them. So from some starting room (often called a foyer) you could go north to somewhere or east to somewhere and then so on. I don’t know why but I decided to build a MUD in my head using my space visualization therapy techniques.
I started with a foyer. It has a tiled floor with black and white checkering, dark wood panel walls with red velvet padding, a rosewood hat rack, and a plain wooden chair.
North from there there is an entry hallway with a similar aesthetic. It has doors to the north, east, and west and a staircase up. The door east opens into a WWI era trench. I go here in times of crisis and hunker into a dugout while artillery explodes and bullets fly overhead. To the west is the pillow room which is warm but not hot, fragrant but not reeking, and absolutely stuffed with pillows. I go here when I’m allowing myself to relax.
Up the stairs is a long landing with doors along the wall. The first door is the room of constant suffering. In this room I can’t close my eyes and everywhere I look is a gilded framed picture playing out the worst scenes I can imagine (like Salò x 100). I can hear an incessant, surrounding wall of screaming anguish and the harshest feedback. I don’t really choose to go in here. I just find myself in here during panic attacks.
Next is the TV room, then the rope room. After that, a door opens into a glass dome I call the observation deck. Outside the glass dome is whatever I’m seeing in “real” life. I go here when I’m in a situation that is uncomfortable and “watch” it from behind the glass, putting myself on autopilot.
North from the entryway is another hallway with a door for the library which is just a library. I go here to review ideas and things I’ve read. At the end of the hallway is a staircase down which goes to the basement of my parents’ house circa 2001. It’s dark and wet down there and under foot are broken toys. I can hear sobbing.
Floating somewhere with no connecting doorways (something that can happen in a MUD if a door object is destroyed) is the doorless room.
I “go” into this palace a lot and it helps when I’m experiencing panic, depression, or executive dysfunction. By focusing on “being” there and moving around I can start a cognitive feedback loop that affects my mood and state of being.
Recently I was having a very rough panic episode about my life and quitting my job. I went into the foyer and sat down unsure where to go. It occurred to me that I had never visualized the south “wall” of the foyer. I’m always sitting in it peering north into the structure. I decided to imagine turning southward and opening the “front door” of the palace.
My imagination populated the “space” beyond the open door with an infinite swell of blue-white light that pulsated. I perceived it as my unconscious/subconscious/reactive self and saw it with a total sense of compassion and love; it was like a wild creature and I wanted to care for it. This experience really affected me and has stayed vibrant and powerful in the weeks since. It feels like it represents one of the most significant leaps forward for my daily mental health in years.
Ultimately I can’t say whether all of this is a fluke of my own overactive imagination or if it has any applicability for others. I also don’t know if this “technique” is what has helped me with mental health over the years or if it’s just a retroactive way of telling a story about my self-work with therapy, journaling, and meditation. I’ve never met anyone else who has described this sort of thing but I feel like the memory palace approach to memorization must be psychologically very similar.
Addendum: I shared a draft of this with a friend and he pointed out that whatever it is I’m doing, it has a lot in common with mandala techniques .
I made a new thing: a website for making blackout poetry with over nine million chunks of text extracted from Project Gutenberg. It’s here at blackout.tilde.town .
Ever since ~kc posted this page I’ve been inspired by blackout poetry. I wanted an interface not only for doing it, but for giving me novel text to work with as well.
I used Project Gutenberg’s robot access instructions to get about 12 gigabytes of compressed plaintext English language books. It translated to about 35,000 books once duplicate encodings were ignored.
This code , gutchunk, uncompressed the books and combed through them for what i’m calling “chunks.” I was looking for meaty sections of text that would make for good blackout poetry fodder. My approach is fairly naive. I store text in a buffer until I see two newlines, then check if I have enough in the buffer; if I do, I cut a chunk. If I don’t, I discard it.
To my extreme pleasure I ended up with over nine million chunks. This is all sitting in a sqlite3 database on the town and if you’re reading this and are also a townie, let me know if you want access to it.
When I was working on prosaic over the years I got a lot of junk from my sloppy parsing of gutenberg books. I was young and silly and not writing great code then. I was also afflicted with this perverse need to ingest ALL of the text into my cut-up corpora. I got a lot of cruft: chapter headings, tables of content, captions, and similar. So far I’ve pulled well over a hundred of my nine million chunks and they all look quite good. My simple heuristic avoided a lot of the noise that I get when running prosaic. Of course, I’m missing some text: short bits of dialogue, for example. This kind of thing would have haunted me in the past, but now knowing that mystery remains in these books feels good. I don’t like finding the bottom of the swamp .
If you’re interested, the code for blackout.tilde.town is also up on our gitea .
There is no way to iterate over the chunks; you get a random one every single page load. Given the size of the ID space, this should mean an infinitesimally small chance for repeats. I wanted an experience like the library of babel ; one of wandering and digging up scraps to scrawl upon.
I’m hosting this decidedly personal project on tilde.town because I felt like it was a nice fit for our community. It’s also my house and I can do whatever, though I try not to have that mindset too often.
I may also make an SSH-hosted text-mode version. I haven’t decided.
I’ve already been really pleased with the experience of making poems using the new site and hope you like it, too. Please let me know on mastodon or wherever if you’re making stuff with it.
I made a new piece of software . It’s a command line piece of art.
The software accepts any number of filenames as arguments. each file is then interleaved, character by character, into a grid. the grid of characters is then ignited and the fire spreads downward. characters eventually become smoke particles that float upward and wisp away into nothing.
You can read about the practice that inspired this project on on wikipedia .
I made this program because I wanted something I could run ritualistically. Initially, it was to run on a computer as a way to make it feel like a home. I’ve been using it, however, as a meditation aid. Before commiting to a potentially stressful task, I get a related text file and then watch it burn away. It’s comforting and gives me some space and time to breathe.
Ritual is important. It can help nudge the brain into certain states. It can provide structure to a day or event which in turn can help focus a mind in turmoil. It provides an intentional space for reflection. I don’t get much out of rituals involving physical objects, however. I think living in America my whole life has made me consider many physical goods as a form of kipple . This was less true growing up when I lived in a forest since I could wander out and find a weird stick or rock or curious leaf covered in gall; but since then, even if I go out and obtain something from the natural world to use ritualistically, I am distracted by how shallow and capitalist it feels. It’s also frowned on to be seen burning things in an urban environment.
the smudge program is a way to address this for me. Text files feel like special objects. They occur organically and have a shape to them that is incidental, like something from a forest floor. And digital conflagration can’t burn down my house. I have found this program to be highly satisfying for its intended end.
It is written in Go. I have been slowly adding to a tiny “framework” for doing this kind of programming in Go on the command line based on a library I really like called tcell . If you are interested in that code, you can see it on github. I might split it out into its own library. Let me know if that seems useful.
If you want to download and use smudge, you can get a binary from its release page for your OS.
I got a new computer. It’s a thinkpad (x1 carbon gen10) and came with Ubuntu preinstalled. I often say this about new computers, but I really like it. I tend to get to a point when I’m mad at the new computer and then all feels lost until the next one. This one feels different; it feels like home. This is a blog post about bookmarks but first: a tour through computing disappointments from the thinkpad I had in 2010 to today:
- the thinkpad in 2010 did not let me down. I loved it. I lost it in a very bad breakup.
- job gave me a macbook. it was heavy and hot. I put ubuntu on it and it barely worked. I hated it.
- next job gave me a dell xps 13 with ubuntu. it was hot and sharp. the hard drive eventually died.
- I actually have no idea what the next job gave me. I just don’t remember at all. that’s weird. probably a mac book pro.
- next job gave me a thinkpad x1 carbon gen5. I put linux on it. I liked it mostly but it had very quiet speakers and a dim screen. Also hot.
- job forced a switch to mac. mac book pro 2018. I hated the touchbar. heavy and hot. really bad keyboard.
- microsoft surface go. this thing was adorable. Basically a netbook. Awkward on my lap, though, and ran real slow.
- microsoft suface book. the worst designed laptop I have ever used. screen cracked in my bag and it cut my thumb a few times.
- microsoft surface pro x. Also awkward on my lap and blue screened once a day. laughably unusable.
- system76 lemur pro. I had such high hopes. terrible keyboard, bad speakers, bad touchpad, and serious hardware issue around battery consumption. gave it away.
- job gave me an m1 mbp. I came pretty close to liking this laptop. ultimately it was macos that made it unpleasant for me. also, i did not love the keyboard.
This new bud has a beautiful screen. decent speakers. A luxurious keyboard and touchpad. Big SSD. even the fingerprint reader works in Ubuntu. Since its first boot this laptop has felt like home.
Something about this home feeling has made me feel comfortable. Like I’m sinking into a cozy chair and taking stock of a warm, safe, familiar cottage. I set up Firefox and synced my stuff and felt like arranging my big pile of unsorted bookmarks from the past decade-ish.
here’s some that felt notable. maybe i’ll add more later.
increpare.com a large collection of interesting little games, many of which are playable in the browser. I do not know how or when I came across this.
neo habitat a remake of the original graphical multiplayer game.
A PDF of Richard Bartle’s Designing Virtual Worlds book Unfortunately his site has gone down but the Wayback machine has a backup.
lincoln brigade database database of americans that volunteered in the spanish civil war
this da share zone tweet my wife and i reference constantly
this gif
imdb entry for Colony Mutation Came across this fascinating, kind of cronenberg-without-budget movie recorded onto a blank VHS tape in a thrift store.
the patent for disco balls
the wikipedia article for Leopold von Sacher-Masoch. Masochism is named for him. Though he didn’t want that.
drama in alphaworld
a gallery of cyberpunk/hacker zines some really cool stuff i haven’t seen elsewhere.
tl;dr
I’m fully rewriting the tildemush MOO engine as hermeticum and actually plan to release it for real this time ^_^
huh what
A few years ago I shipped an alpha version of a new MOO style system called tildemush. It was crude in many respects, but did function. In addition to basic account creation and chatting features, it supported:
- a custom lisp-like language called WITCH for scripting objects
- a bidirectional key/value system for object metadata mutated through code
- a permission system for objects
- an in-client editing interface for objects’ code
- ability to create rooms in client and move among them
- a way to view a map of the world’s rooms using ascii graphics
- support for transitive and intrasitive verb handling
Unfortunately, it had an insurmountably large amount of technical debt and continuing development on it was not pleasant. I shelved the project for almost four years, seriously unwilling to admit that I felt it was unsalvagable. I was not able to shake the dream of seeing this project through, however, and decided it was worth a full rewrite.
Thus, this blog post serves as an announcement of Hermeticum, a full rewrite and re-imagining of tildemush. I waited to make a statement like this until I actually had something working. I’m pleased to say I have a rudimentary client and server going in the Go language, including a new version of WITCH powered by Lua instead of Hy.
The vision of the project remains the same: a social, creative place targeted at the tilde town community that embraces the spirit of MOO/MUSH/MUD/MUCK engines with a fresh perspective.
Though huge features are still missing, I am very excited about the foundation I have laid and am more optimistic on delivering a compelling experience than I ever was with tildemush. If you want to follow along, I’m tracking progress in a roadmap file.
rambling pontification
You, dear hypothetical reader, might be asking why I’m bothering with all this. It’s 2022; there are both decades-old existing MOO/MUSH/MUD/MUCK engines as well as a whole world that has moved on from them. Why not try and revitalize interest in existing technology? or just go live inside of the metaverse forging NFTs or whatever with my digital blood, cyber sweat, and virtual tears?
I have, since youth, been obsessed with the idea of being “inside” a computer. To this end I have created things like tilde town, murepl, and other communities and technologies long since dead. I have also tried a bunch of MUDs and MOOs. To date, however, none of my creations or dabbling with pre-existing communities has fully scratched the itch I have had since I first used a computer in like 1992 or whatever.
I feel that existing MOO/MUD/MUCK/MUSH technology is saddled by both technical and community debt. Technically, such engines had to make engineering trade-offs for very constrained execution environments. These trade-offs led to scripting experiences very difficult for beginners to understand. They are also from the telnet era, which seriously constrains both client capability and security. Community-wise, MOO/MUD/MUCK/MUSH engines rose up out of a kind of competitive and often exclusive nerd culture. There was a lot to love about this era of culture (most notably how it fostered techno-utopian feminist thinkers), but I like less RTFM-style environments in favor of those that welcome the kind of spontaneous creativity that newcomers can bring to a place if they feel sufficiently welcomed.
As far as why I’m still so invested in “antiquated” text-based experiences in this (cursed) world of ponzicoins and addiction-oriented graphical MMOs? Text is a perfect jumping-off point for imagination and creativity. It’s endlessly mutable and highly accessible. I love text and don’t see a reason to abandon it, especially in a post-unicode world.
do you want to help?
The user registration/login code both client and server side needs help and is isolated from the actual game engine stuff that I’ll be focusing on in the short term.
Additionally, I’d love help shaping WITCH, the in-game object scripting language. This requires folks interested in doing some beta testing–creating objects, giving them behavior, and providing feedback on its ease of use. I’m new to Lua and would appreciate feedback on how I’m using it.
For now the development is happening on GitHub. I’d like it to be elsewhere, but haven’t made up my mind where it should go.
anyway, uh
have a good one!
driving from chicago to berkeley we chose to go through south dakota because to my friend and me it was a mysterious, unvisited place. the wall drug signs begin soon after crossing the border on 80. i was unfamiliar, but my friend filled me in: a place that exists self-referentially. it doesn’t offer services beyond that of any typical rest stop, and the draw to go there is the chance to experience what amounts to a meme (in the classical sense). in other words, a tourist trap.
it got me thinking about self referential advertising: ads for a place that exists only to serve ads for itself. the place makes money by selling advertising (ie tchotchkes with Wall Drug on them).
then, Marvel movies popped into my head. my experience of Marvel movies is that they lack any real substance. they are an IP portfolio: a collection of brands that interact in surface and shallow ways in order to sell merchandising. a Marvel movie is a commercial; the commercial is for itself.
ultimately i decided i preferred Wall Drug since, unlike the Marvel Cinematic Universe, at least Wall Drug gives you free ice water.
i have moved to berkeley. of chief importance is finding the coffee. the following is the result of initial recon bike rides.
- artis. the first espresso i had here was capital P Perfect. the second two were Pretty Good. the cafe music switching over to top 40 at some point was disconcerting.
- réveille coffee. it was pretty good, though i wasn’t too into the breakfast burrito. Further recon revealed that their chilaquiles are really delicious, though.
- highwire (san pablo). perfectly cromulent
- cafenated. the espresso was in no way bad, just the one i was least excited about. i did rather enjoy their breakfast burrito, though.
- coffee conscious. i really hate to say this. i do. but it’s the worst coffee i have had in the city. i’ve been multiple times in disbelief. i also do not like the donuts they carry.
- my coffee. have only been once but the espresso was very, very good.
- signal. pretty good. similar tier as Cafenated.
- the hidden cafe. i do not remember the coffee from here which means it was neither notably bad nor good. mostly i just remember how cramped it is trying to go there if the weather is at all nice out.
still to try: breadxcoffee, coro, royal ground, souvenir, hal’s
taking dark steps and eating half the breadcrumbs is how i live. i no longer try to find the exit, just remember the rooms. meal time with the minotaur. the maze has it all: a trade in lunacy, nickelodeons, international coinage, soliloquies, eulogies, biscuits. when the imagery gets vivid i don’t depart in death–it’s just imperative to keep moving. it’s imperative to keep moving and not get stuck in the windowless room that sometimes forgets its own door. there is an infinity of better rooms than that. there’s the screaming room where ears can’t be covered eyes can’t be closed and in every direction the worst thing you ever beheld. there is the room of soft walls always yielding but never suffocating full of dry warmth and lavender. the library smelling of book mold and dark woods. the study with green glass lamps and green felt desk beds and pens and pens. the dark room where there is nothing. most critically, the foyer with the umbrella bucket and the coat pegs and the wash stand with the white marble. there’s a chair in the foyer and i’ll sit here when i don’t know which door to open. the chair is made of wood and has a creak to it.
I made a blog. I haven’t had one in years. When I did it was mostly for dream logging and poetry. I was always pretty self conscious about what I put there. I published my town feels
posts as a “blog” for a while, but that never felt right. My feels
content was overly personal, diaristic, and vulnerable. I used to think you could either be authentic (vulnerable to a fault) or inauthentic (crafting a personal brand), but now think often of a phrase I heard an actor use in an interview about learning to be “private in public.” I interpreted that as being forthcoming with yourself in the public eye – which we’re all in, now, thanks to the internet – but being defensive about what you share.
Another reason I’m making one of these again is self-actualization. Historically I’ve thought very poorly of myself and agonized over anyone actually caring what I posted. Now, I’m just excited to share whatever I’m excited about or mentally chewing on, not out of self-aggrandizement, but because the stuff I find interesting is interesting because I find it interesting. It’s a very cozy tautology. I’m not interested in building a following or crafting a brand: just sharing what inspires me in an honest way while still keeping some of myself to myself.
Finally, I like to mark time with the discovery of artifacts. I’m always hunting for inspiring things–books, sites, objects, people–and feel an urge to catalogue them so I can be re-inspired in the future. I post on social media about these things sometimes, but social media is uniquely unsuited to reflection and later perusal. I liked Tumblr for this to an extent but never got comfy posting there; too many numbers and buttons and noise there for me to feel like I could collect my thoughts or feel like I was posting for myself instead of a hypothetical audience that might “like” something. I also don’t like being beholden to corporate platforms.
Some initial posting fodder:
- Going through a decade’s worth of unsorted bookmarks and posting interesting finds
- Reporting on 1990s primary “cyber media” that I collect like academic books on hypertext and trashy web magazines
- Project ideas that I’ll never get to
- Project ideas that I have gotten to
- My “religious” interests in Discordianism and Hermeticism
- Fiction/poetry/essays
Technically speaking, this is all powered by some markdown files with custom metadata embedded in it, a <100 line bash script, and a Go program for handling a little linking macro. I wanted to be able to author links in a consistent way but have sensible renderings in HTML, Gemini, and Gopher. All of this, including posts, can be found in this repository. I considered a static site generator…but I prefer scripting my own thing wrt blogging. It keeps me humble and I find that I don’t use most of the features of off the shelf things.