gopher://gopher.someodd.zip:70/1/catalog/misc_tech/Unsorted Someodd TechUnsorted Tech Someoddverse2026-01-22T00:00:00Zgopher.someodd.zipgopher://gopher.someodd.zip:70/1/misc_tech/how_i_publishI Replaced My Web Stack With Gopher (1991) and Failed Less2026-01-22T00:00:00Z2026-01-22T00:00:00ZA love letter to RFC 1436 and the author's choice to replace a mode...A love letter to RFC 1436 and the author's choice to replace a modern web stack with plain Gopher, with fewer failures and more joy. Draws 'intimacy over scale' as the thesis and invites pre-publication feedback.gopher://gopher.someodd.zip:70/0/misc_tech/best-of-smallnet-april-2025.txtBest of Smallnet Zine #0: April 20252025-04-09T00:00:00Z2025-04-09T00:00:00ZThe 0th edition of Smallnet Zine (April 2025), rounding up the stat... HTML energy is all around us and in this very website.
>
> Building websites has become complex,
> but the energy of HTML persists.
>
> What makes HTML special is its simplicity.
>
> HTML isn’t a vast language, yet you can do a lot with it.
>
> Anyone who wants to publish on the web can write HTML.
>
> This accessibility and ease of use is where its energy resides.
>
> Who’s writing HTML today?
### frstcomputer.com
1Bespoke computer store in gopherspace / frstcomputer.com 70
A boutique computer with a boutique shopping experience via Gopher!
### 250kb.club
h250kb.club https://250kb.club/
My friend showed me this. Web pages that are under 250KB in size.
> The 250KB Club is a collection of web pages that share certain values, especially a focus on performance, efficiency, accessibility and sustainability.
### Melon Land, Melon King
This guy is a indieweb artistic genius.
hMelonLand forums URL:https://forum.melonland.net
This forum looks **amazing**. It's centered around indieweb type things. I talked to him about this in an interview and he said he found some really old software and themes.
hmelonking website URL:https://melonking.net
Amazing website, very artistic indieweb experience like none other.
## Some articles I've written on self-hosting
Get started self-hosting! Running your own server is fun!
0Music server with MPD /phlog/music-server-mpd.gopher.txt
0Counter-Strike 1.6 Server in Linux /phlog/linux-counter-strike-16-server.gopher.txt
0XMPP audio/video call support /phlog/xmpp-server-video-audio-calls.gopher.txt
0Host your own XMPP server /phlog/xmpp-server.gopher.txt
0Host your own IRC server /phlog/irc-server.gopher.txt
0Make your own VPN /phlog/wireguard-simple.gopher.txt
]]>gopher://gopher.someodd.zip:70/0/misc_tech/i-am-now-a-bitreich-member.txtI'm now a member of Bitreich!2025-03-28T00:00:00Z2025-03-28T00:00:00ZPersonal announcement that the author has officially joined Bitreic... We form a movement to improve our daily software life. Software has to
> not misbehave, it has to follow our rules, it has to be reusable, it has
> to be easily maintainable, it has to provide its recompilable source and
> it has to be easily understandable.
0Bitreich Manifesto gopher://bitreich.org:70/0/documents/bitreich-manifesto.md
h20h, the main person behind Bitreich, is a member of suckless.org URL:https://suckless.org/people/20h/
I had been helping out tangentially by working on my Whisper Radio project, because they also had their own radio service.
I also have been working on uncovering history regarding the Gopher Protocol and working on a lot of Gopher software.
1You can see my previous Halloween post about Bitreich /phlog/bitreich-haunted-hosts.gopher.txt
0Official Bitreich announcement: /usr/20h/phlog/2025-03-27T18-29-56-532851.md bitreich.org 70
> # 2025-03-27 18:29:56.532851 UTC (+0000)
>
> Welcome someodd as new Bitreich member!
>
> The council has decided to make someodd a new member of Bitreich. He has
> contributed to Bitreich by being a burning fighter for gopher and
> simplicity. He works on radio, gopher software and did ground breaking
> research into gopher history. There is much to come for the whole of the
> community.
>
> Welcome!
>
>
> Sincerely yours,
>
> 20h
> Chief Community Manager (CCM)
They gave me an SSH account which has some very interesting/fun services. For example, they have their own gopher service:
1My Bitreich gopherhole /usr/someodd bitreich.org 70
I'm very honored and happy to be an official member. I really admire the community vibes and their work.
]]>gopher://gopher.someodd.zip:70/0/misc_tech/my-first-submission-hackage.txtBecoming a Hackage uploader2025-03-28T00:00:00Z2025-03-28T00:00:00ZThe author's path to becoming a Hackage uploader, starting from the... 1. Hackage is intended to be a permanent record. Therefore uploads
cannot be changed or removed.
> 2. Only upload things that work, are useful to other people, and that
you intend to maintain.
> 3. Use `cabal gen-bounds` to put PVP-compliant version bounds (lower
> AND upper) on ALL your unique dependencies so your package will still
> be buildable years down the road. One important thing to note is that
> you only need to include version bounds once. For example, if you
> depend on the same package in your library and your test suite, you
> only need to put the version bounds for that dependency in one place.
> This keeps the dependency bounds information DRY.
> 4. Package candidates CAN be changed, so use them to test things out
> and get everything right before you publish permanently to the main
> index.
You should check that your source bundle builds, including the Haddock documentation if it's a library.
Here's my candidate, for now, which may be a dead link: https://hackage.haskell.org/package/Venusia-0.1.0.0/candidate
Be careful, Hackage, at least when defining a dependency, is case-sensitive! This really threw me off! I feel like this is actually really bad and has potential to be exploited if, say someone uploads a package of the same name, just lowercase, if it's capitalized, or something like that. Hopefully they prevent that somehow.
I couldn't figure out how to install a candidate dependency using Stack, so in the project I wanted to use Venusia as a depnency in I just used:
```
extra-deps:
- git: https://github.com/someodd/venusia.git
commit: ffae72d03d3b24e7507354071490f539868c6821
```
Oh also i think i may have had to create a `src/` for my project? Maybe that was just a warning.
## Haskell's versioning: PVP
Package Versioning Policy and have version bounds on all dependencies indicating which versions they are known to build with. See: [Package versioning and curation](https://hackage.haskell.org/upload#versioning_and_curation) and [Haskell PVP Specification](https://pvp.haskell.org/). Something that really helped me was in the Haskell PVP FAQ ["How does the PVP relate to SemVer"](https://pvp.haskell.org/faq/#semver)?
I took the time to understand the Haskell PVP Spec and the section on "package
versioning and curation." I think I understand, mostly, now, that the spec is
about not breaking other people's code, but also describing how much it might
break code (almost like an estimate of how long it'd take to adapt new code) as
well as signaling if there were non-api-breaking features/changes, for the most
part. So in that sense for A.B.C, 'a' seems to be like "super major" like "the
API]]>gopher://gopher.someodd.zip:70/0/misc_tech/life/applying-avantos-ai.txtApplying to Avantos AI (job)2025-03-24T00:00:00Z2025-03-24T00:00:00ZWalkthrough of applying to Avantos AI via a cryptic challenge-based... You'll need to make sure the user agent isn't something too bot-seeming or WAF will block you. (Sorry we're a startup no time to fix.) This user agent works: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
So here I ran the command in verbose mode:
```
➜ post-apply curl -v -X POST https://apply-to-avantos.dev-sandbox.workload.avantos-ai.net/ \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:117.0) Gecko/20100101 Firefox/117.0" \
-d '{"email": "my email"}'
Note: Unnecessary use of -X or --request, POST is already inferred.
* Host apply-to-avantos.dev-sandbox.workload.avantos-ai.net:443 was resolved.
* IPv6: (none)
* IPv4: 18.190.42.252, 3.22.13.83, 18.117.63.32
* Trying 18.190.42.252:443...
* GnuTLS ciphers: NORMAL:-ARCFOUR-128:-CTYPE-ALL:+CTYPE-X509:-VERS-SSL3.0
* ALPN: curl offers h2,http/1.1
* found 152 certificates in /etc/ssl/certs/ca-certificates.crt
* found 456 certificates in /etc/ssl/certs
* SSL connection using TLS1.3 / ECDHE_RSA_AES_128_GCM_SHA256
* server certificate verification OK
* server certificate status verification SKIPPED
* common name: apply-to-avantos.dev-sandbox.workload.avantos-ai.net (matched)
* server certificate expiration date OK
* server certificate activation date OK
* certificate public key: RSA
* certificate version: #3
* subject: CN=apply-to-avantos.dev-sandbox.workload.avantos-ai.net
* start date: Mon, 03 Mar 2025 00:00:00 GMT
* expire date: Wed, 01 Apr 2026 23:59:59 GMT
* issuer: C=US,O=Amazon,CN=Amazon RSA 2048 M02
* ALPN: server accepted h2
* Connected to apply-to-avantos.dev-sandbox.workload.avantos-ai.net (18.190.42.252) port 443
* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://apply-to-avantos.dev-sandbox.workload.avantos-ai.net/
* [HTTP/2] [1] [:method: POST]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: apply-to-avantos.dev-sandbox.workload.avantos-ai.net]
* [HTTP/2] [1] [:path: /]
* [HTTP/2] [1] [accept: */*]
* [HTTP/2] [1] [content-type: application/json]
* [HTTP/2] [1] [user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:117.0) Gecko/20100101 Firefox/117.0]
* [HTTP/2] [1] [content-length: 28]
> POST / HTTP/2
> Host: apply-to-avantos.dev-sandbox.workload.avantos-ai.net
> Accept: */*
> Content-Type: application/json
> User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:117.0) Gecko/20100101 Firefox/117.0
> Content-Length: 28
>
* upload completely sent off: 28 bytes
< HTTP/2 200
< date: Tue, 25 Mar 2025 00:33:13 GMT
< content-type: application/json
< content-length: 404
<
* Connection #0 to host apply-to-avantos.dev-sandbox.workload.avantos-ai.net left intact
{"challenge_link":"https://fluttering-atmosphere-1b5.notion.site/Journey-Builder-React-Coding-Challenge-190d5fe264fa80cba39ec21afc6d42ec","instructions":"Submit your solutions as a link to a github repo named `045eb7` to the following email address: challenge-request-sub-aaaapriy22ktilybsd6gv7beiq@avantos.slack.com. Questions can be sent to challenge-help-aaaaprjeraoxiaa2wlnlda7vsi@avantos.slack.com"}%
```
I opened up [the challenge link](https://fluttering-atmosphere-1b5.notion.site/Journey-Builder-React-Coding-Challenge-190d5fe264fa80cba39ec21afc6d42ec). It kind of seemed like they didn't want me just copying-and-pasting the challenge into Claude or ChatGPT or something because they disabled ctrl+a (maybe not intentional), so I also assumed there was more logging than that going on. So I]]>gopher://gopher.someodd.zip:70/0/misc_tech/what-i-learned-years-gopher.txtLessons writing Haskell code for a 33 year old pre-web Internet protocol (Gopher)2025-03-16T00:00:00Z2025-03-16T00:00:00ZLessons from writing Haskell for the Gopher Protocol — a 33-year-ol...
## notes
careful quickcheck isn't inductive proof
not only that but it taught me to run servers better and make things more reliable. more reliable daemons, systemd, to whisper radio, dogfooding to the max libraries etc, to even server announcemen
## Let's dive in
If you take a look at [my GitHub](https://github.com/someodd/) you'll notice two things:
1. It's pretty much all Haskell
2. Wow, there's a lot of stuff written for "the Gopher Protocol," what even is that?
I had encountered The Gopher Protocol as a child, but never really got to know it until the last few years. I had heard about it from a friend who was describing a *debloated* and organized net. I'd come to learn that's fairly accurate, especially considering both how Gopher is mostly simple text and how it was even involved in some librarian conferences.
A programmer I looked up to championed Haskell. In fact, lots of programmers I thought were cool were using Haskell. It tickled my fancy when it came to craft and the esoteric. I think really what started my journey was finally being fed up with Objected-Oriented Programming and (inconsistent) mutability. I also didn't like a lot of the conventions that were going on in that sphere, I often felt like people were twisting their code to be more sophisticated than just accepting the brutalist aesthetic of the fact that they were dealing with structured data and ways of mutating that data, which I would come to learn Haskell really drove home.
**work on this**
I started dabbling with the Gopher Protocol to learn Haskell. I'm a bit of a techno-romanticist. I like to host my own services on my server. Even old stuff. In fact, I think there's a lot of wisdom in the old stuff. Of those unix legends. Those old programmers I looked up for so long. I remember for a long time in programming, before AI kicked off, it really did feel like everything was just reinventing the wheel and you really could just use a tool made or started 30+ years ago to do "the latest thing." I really enjoyed the idea of such stable and historical software that was so practical. I really loved running my own software, writing my own code, fusing craft and art with it all (even with the concept of server-as-an-art-installation). It also was a gateway to interesting friendships. In many ways I still feel this holds true. I like the BSDs, I like Debian, I like the idea of code as a craft, or even code and serveradmin as an art, for example:
* netring
* I even like running Window Maker sometimes, swith all kinds of arts dockapps (link here, i should really update that shit with pictures too)
* whisper-radio: an internet radio station (icecast) which reads the latest news in gopherspace, mastodon, responds to users, plays music, reads text
However, I think over the years, for one reason or another, my enthusiasm waned, my ability to hold such a romantic view, have such a romantic relationship with tech waned. IT all just became a tool, a utility, plain and simple.
My last attempt at rekindling this started with when I found Haskell and the Gopher Protocol.
I found Haskell wasn't just one of these things I could quickly learn by doing--I actually felt the need to do a little bit of book learning.
I decided to really start understanding Haskell, after reading the obligatory [Learn You a Haskell for Great Good!](https://learnyouahaskell.com/), by finally getting around to starting a project. I decided to make a text UI client for the Gopher Protocol, which would speedrun me understanding both, also incurring heavy tech debt and mistakes along the way, but that's what learning projects are for]]>gopher://gopher.someodd.zip:70/0/misc_tech/announcing-netring-cafe.txtAnnouncing netring.cafe: indieweb and smallnet zine2025-03-08T00:00:00Z2025-03-08T00:00:00ZAnnounces netring.cafe, a zine-style webring for home-hosted smalln...gopher://gopher.someodd.zip:70/0/misc_tech/news-starting-smallnet-gopher-documentary.txtI'm starting a smallnet/Gopher Protocol documentary2025-03-08T00:00:00Z2025-03-08T00:00:00ZAnnouncement of a smallnet and Gopher-focused documentary, includin...gopher://gopher.someodd.zip:70/0/misc_tech/netspace-exploration-as-virtual-installation-art.txtNetspace as virtual installation art2025-03-01T00:00:00Z2025-03-01T00:00:00ZFrames netspace exploration (Gopher, smaller sites, retro games) as... /var/www/steelbluesilk.blue/index.html
sudo vi /etc/nginx/sites-available/steelbluesilk.blue.conf
```
file contents:
```
server {
listen 8765;
#listen 8888 ssl;
server_name steelbluesilk.blue;
root /var/www/steelbluesilk.blue;
#ssl_certificate /etc/letsencrypt/live/steelbluesilk.blue/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/live/steelbluesilk.blue/privkey.pem;
location / {
default_type "text/plain";
root /var/www/steelbluesilk.blue;
}
}
```
Let's add it to sites-enabled and restart the service:
```
sudo ln -s /etc/nginx/sites-available/steelbluesilk.blue.conf /etc/nginx/sites-enabled/
sudo service nginx restart
```
... now should be able to access http-only http://steelblue.silk/
let's do the SSL cert:
```
sudo certbot certonly --webroot-path="/var/www/steelbluesilk.blue" -d 'steelbluesilk.blue'
sudo vi /etc/letsencrypt/renewal/steelbluesilk.blue.conf
```
Add this post hook, under `[renewalparams]` (not sure if this is required, actually):
```
post_hook = service nginx restart
```
Test renewal:
```
sudo certbot renew --cert-name steelbluesilk.blue --dry-run
```
Now go back to the nginx config and uncomment the SSL lines, and `sudo service nginx restart`.
]]>gopher://gopher.someodd.zip:70/1/misc_tech/gopherhole_adventures/strollStroll2024-12-30T00:00:00Z2024-12-30T00:00:00ZA poetic stroll around a very special lake.A poetic stroll around a very special lake.gopher://gopher.someodd.zip:70/0/misc_tech/techniques-and-lessons-from-years-of-gopher-development.txtTechniques and lessons from years of Gopher development2024-11-29T00:00:00Z2024-11-29T00:00:00ZReflections from 4+ years of writing Gopher Protocol software, star...gopher://gopher.someodd.zip:70/1/misc_tech/joining_the_madeJoining The MADE: Retro Tech Museum2024-11-27T00:00:00Z2024-11-27T00:00:00ZJoining The MADE (Museum of Art and Digital Entertainment), a retro...Joining The MADE (Museum of Art and Digital Entertainment), a retro tech museum. Frames the author's archival and documentary interests going forward.gopher://gopher.someodd.zip:70/1/misc_tech/bitreich-haunted-hostsMy entry for Bitreich's "Haunted Hosts" Halloween Event2024-10-14T00:00:00Z2024-10-14T00:00:00ZThe author's submission for Bitreich's annual 'Haunted Hosts' Hallo...The author's submission for Bitreich's annual 'Haunted Hosts' Halloween event. Describes the theme and the gopherhole contribution in detail.