On gopher conservatism
----------------------

(WARNING: long, rambly, preachy content ahead)

Recently, ZLG wrote[1] about his distaste for an attitude amongst
certain Gopher users that we must actively resist Gopher becoming
"like the web".  I would like to ask ZLG to expand on his thoughts
here, because absent the context of the original discussion in
#gopherproject that triggered his post, it's not perfectly clear what
sort of philosophy is being railed against.  I may agree with it, or I
may not.  The issue of Gopher conservatism is a complicated ones.
"Changing gopher" can mean a lot of things, with making changes to the
base protocol and getting them widely implemented in clients and
servers at one extreme, and simply changing conventions of usage
within the confines of strict backward compatibility with the original
software from Minnesota.

One concrete thing ZLG did mention was excessive hierarchy.  I have
definitely been bothered by this.  The "Why is Gopher still relevant"
document by Cameron Kaiser[2] that so many SDFers link to from their
root menu puts Gopher's hierarchical structure up on a pedestal and
says that *this* is why we all love Gopher, not because we're tired of
the obese and distracting web.  I actually don't think this is true at
all for most active Gopher users today.  There's not an awful lot of
deep hierarchy in most gopherholes, and where it does exist it's not
really that different from well-organised material on the web.  While
it sounds nice and clean, I do get a little tired of the old "home" ->
"phlog" -> "this year" -> "this month" -> "latest post" dance.  But
maybe that's a flaw with my workflow, and with better use of some
kind of tool like moku-pona I would be blissfully jumping directly
to content.

On the question of changing gopher in general, I am not quite as
conservative as some.  There are a plenty of newer servers and clients
under active development these days and I am not completely opposed
to them doing new things which very old software can't handle.  I
understand some people like to surf gopherspace from very old or
under-powered hardware, and a lot of this hardware may be more or less
permanently stuck with old software.  I would genuinely hate to see
these people totally unable to browser modern gopher content at all
because some massive change broke their clients, and I would oppose
anything that could result in that.

On the other hand, I don't think I have a problem with lots of nice
small upgrades that would just result on them missing out on little
things.  For example, there is a "telnet" itemtype in Gopher, and
clients which support it (like VF-1) let you launch a telnet
connection to some sever on some port just by selecting a gopher menu
item.  It seems obvious to me and not at all contrary to the spirit of
Gopher that in 2018 it would be nice if the community could
standardise on a new itemtype for SSH that functioned in precisely the
same way.  This would require no server-side changes and changing any
client that supports telnet items to support SSH ones too should be a
very simple effort.  This would let those of us using modern clients
do some cool things.  People stuck with ancient gopher clients are
probably also stuck without SSH clients that connect to modern servers,
so they're not going to miss out on anything anyway.  I may have to
suggest this on the gopher-project mailing list.

So, clearly I am not opposed to all progress when it comes to gopher.
However, *in general* I am pretty skeptical about changes to gopher
beyond, perhaps, the level of usage conventions, and this actually is
precisely because I *don't* want Gopher to end up like the web, and I
am terrified of setting the community on any kind of slippery slope
toward this.  I'll elaborate on what I mean, at length (naturally),
and this will also serve as my contribution to the recent thread
of people discussing what makes gopher special to them.

Visiting a website today is basically a massive exercise in trust.  I
am saying to some random, unknown person: "here is my computer, do
more or less whatever you want with it".

This sounds like a crazy exaggeration, but it's not really.  When I
send a HTTP request somewhere from within a modern browser, it is
absolutely impossible for me to know in advance:

* How many subsequent HTTP connections will be kicked off as a result
 of processing what I get back from the first one.
* Which servers those subsequent HTTP connections will be to.
* What kind of content any of those connections will receive.
* Whether my computer will start playing audio or video as a result of
 any of these connections.
* Whether my computer will start executing arbitrary, unauthenticated
 code on a virtual machine (Javascript) which, while sandboxed, still
 has the capacity to consume 100% of my CPU and/or RAM if poorly or
 maliciously written.
* The amount and type of data which may be persistently stored on my
 hard drive as a result of any of these connections.
* What, if any, *previously* persistently stored data on my hard drive
 from *any* previous connections to *any* server may be sent to
 arbitrary unknown servers as part of these unforeseen connections.

In this environment, it is impossible to make informed decisions about
what happens to you on the web.  The web is something that happens
*to* you, whether you like it or not.  The relationship of a modern
web user to webmasters is one of *subservience*.  The *only* possible
course of action is blind trust.  This trust can be and routinely is
violated, and webmasters do all kinds of nasty shit to you every day.
Some of it is "just" minor discourtesy, a total lack of common decency
toward one's fellow human being, like automatically playing videos.
Some of it is far more nefarious, like tracking you everywhere you go
from server to server over the net, and actively countering your
efforts to stop this (by e.g. using "supercookies" to replace the
regular cookies you delete).  This is not just a lack of decency, this
is full on "act of war" stuff.

None of this is true on Gopher.  When I select an item in a gopher
menu I know, a priori, and with total confidence, that I am asking my
computer to make exactly one connection to exactly one known server
and there is no way for the person running that server to trick a
non-buggy client into doing otherwise.  If my client is well-designed,
then I will know *before* I select that item whether it is going to
display an image or play a sound or a video (okay, there is no
standard itemtype for videos and the "binary" filetype leaves you
unsure, but by current very wide-spread convention that is only used
in cases where the item name contains the underlying filename so you
can guess from the extension).  There is no way for the person running
that server to persistently store data on my drive, and there is no
way for them to learn anything about anywhere I have previously been.
There is nothing at all analogous to the HTTP "Referer" header, and
there is nothing that facilitates an analog to the infamous browser
fingerprinting.  Unless my client is badly buggy, it's pretty much
impossible for following a link in gopherspace to cause my CPU or RAM
usage to increase more than very slightly, for a second at most.  The
whole thing is a short, sharp, singular event, concentrated in time,
with no side-effects.

Because of this, I surf through gopherspace fearlessly, unthinkingly,
with a light heart and a clear mind.  I'm like a kid in a candy shop.
I don't have to trust anybody at other end of a socket on gopher,
because *you can't hurt me here*.  The producer and consumer in
gopherspace are on equal footing.  You can offer content to me,
clearly marked as to what is is, and I can consume it, or not,
item-by-item, as I wish.  You can point me to interesting content on
other servers, but you'll never know if I follow those links, and if
I do follow them, those other servers will never know where I came
from.

This is what *really* makes gopher special to me.  Yes, the content
here is great, I appreciate easy navigation and I like the simplicity
of the protocol and all that other stuff, I really do, but the thing I
care about the most is that gopherspace is not an experience that is
forced upon me, it's a safe place for me to actively explore under my
own will power.

I will fight tooth and nail against the widespread adoption of any
change in protocol, or software, or user culture, which I perceive to
threaten this state of affairs.  So, in that sense, I *do* believe
that Gopher must not become the web, ever.

You might think I am being paranoid here and that the simplicity of
Gopher means we are all safe forever from any insidious would-be
spoilers of our textual haven, but it's not true, not by a long shot.
Tomasino has a page in his phlog[3] about achieving persistence or
sessions in gopher to sidestep the limits on applications that can be
built on it.  Tomasino, my friend, I am sorry to have singled you out
here because I have no doubt you are not alone in thinking about this
stuff, and I also don't question at all that you absolutely had not
one iota of ill-intent in writing that stuff, but I must say, it
scares me that you are thinking and talking like this!  Trying to
make Gopher stateful is kind a taboo topic to me.  Yes, it can be
done, and yes, it would facilitate building applications, but why do
we want to build applications on Gopher?  Gopher was certainly not
designed as and historically has not been used as a platform for
hosting applications.  Gopher was designed to permit quick and easy
dissemination of well-organised information.  That is an important job
for something to solve, and Gopher solves it well, so why-oh-why must
we shoehorn it into some other role?  This feels to me like very much
like the first steps toward repeating the tragedy of the web.

I was really, really surprised when the folks from Bitreich - you
know, hardcore minimal software elitists from Germany with high-minded
principles and an honest-to-God manifesto - added a text-based "point
and click" style adventure game[4] to their gopherhole which uses your
IP address to maintain state between requests so that you can travel
around the game, adding items to your inventory and using them later.
Don't get me wrong, I love the game itself, and I've had fun playing
it, even though I can't get very far.  I enjoy the slightly
self-deprecating nerd humour in there (your default inventory includes
an "old Thinkpad", naturally) and I applaud the creativity that went
into it.  But come on, if *those* guys think that rough-and-ready
client fingerprinting based on IP address is acceptable, where can we
expect less principled types to stop?

The Bitreich game uses your IP address to track you through the game.
This is perhaps not a big deal, because your IP address probably
changes all the time, and is not uniquely tied to you because it can
be shared via NAT.  But there are other ways to solve this problem.
There is no reason a suitably written server could not generate a
random hexadecimal string everytime somebody visited the root menu,
and insert that string as a prefix to all other sector paths.   If a
visitor, not realising these tracking strings were in there (because
how often do you look at selectors before following links on gopher?)
bookmarked one of these selectors, then the host would know if they
returned a few days later, even if their IP address had changed.  If
*two* hosts ran this server, and knew they were both running it, they
could also insert the same string into links they display to one
another (hell, if this server *advertised* its support for this kind
of tracking to other servers via a special selector, like Gophernicus'
"/server-status" selector, then any time it linked to another server
it could query it first and insert the tracking tag if it discovered
that it would be supported).  By comparing logs, the admins of these
two hosts could track visitors between their two sites.  This requires
no change to the protocol and no change to the client, it would even
work on ancient UMN gopher.

Right now there is nobody operating in Gopherspace who I believe would
have the least bit of interest in doing this, but my point is that
they *could*.  It is technically possible.  There is no protocol
simple enough to prevent this kind of thing.  The only possible
protections against it are obscurity (and this will probably rescue
gopher from most ills, in the end) and/or a strong, widespread and
actively enforced social norm against it.  This norm would have to be
pretty strict.  If the culture is "maintaining a little bit of state
is okay if it's for a good cause", then slowly but surely,  year by
year, the meanings of "a little bit" and "good cause" get stretched
further and further and twenty years later anything goes.  This is
basically what happened to the web.  If the norm is "no, not even a
little, not even once", then and only then is there a chance that the
status quo can be preserved.

Did I say, many, many lines further up, that "on the question of
changing gopher in general, I am not quite as conservative as some"?
Well, maybe that's not true, maybe I'm the the most powerful
God-damned force for gopher hyper-conservatism on the net.  But I
swear it's not dogmatic.  I'm just worried about something which has
already happened before happening again.  I have no beef with changes
to gopher that can't possibly lead us down that road.  New item types,
no problem.  TLS support, bring it on.  Anything that could
conceivably lead one day to user tracking?  I will come at you in a
dark alley with a bladed instrument.

[1] gopher://zelibertinegamer.me:70/0/phlog/2018-03-18_1452.txt
[2] gopher://gopher.floodgap.com:70/0/gopher/relevance.txt
[3] gopher://gopher.black:70/0/explorations/gopher-application-development.txt
[4] gopher://parazyd.org:70/1/dotg