URI:
       Directory listing for: diggings
   DIR Parent directory (..)
       
  TEXT README.txt (20.1KB, 2026-08-18):
       
        diggings -- prospect gopherspace
       =================================
       
       ------------------------------------------------------------
        What it is & how to start
       ------------------------------------------------------------
       
       Howdy, partner -- welcome to the frontier of gopherspace.
       
       diggings turns gopherspace into an expedition. Gopher is a
       vast, quiet, half-forgotten frontier: thousands of small
       servers, most never linked to, never indexed, never visited.
       diggings rewards you for going out there anyway. Every
       selector you reach is treated as unclaimed ground, and the
       first time you set foot on one you strike gold (+1). Be the
       first person ever to reach it and you strike a bonus (+100),
       and your name is carved in as its discoverer -- on the
       Klondike the creek you struck first took your name and kept
       it, and a selector here does the same. You are a prospector,
       a frontiersman, a gopherspace cowboy out past the edge of
       the map -- and the map fills in behind you as you go.
       
       The point is the going. It is easy -- on gopher as much as
       anywhere -- to wear a groove between the same few holes and
       call it a day. But a rut and a trail are both worn grooves;
       the difference is a rut goes nowhere and the Oregon Trail
       went two thousand miles. diggings exists to pry you out of
       the one and start you down the other: the whole protocol is
       out there, and most of it nobody has bothered to walk.
       
       It is also a textboard laid over the whole protocol: every
       selector, anywhere, is a thread. Wherever you land you can
       read what other diggers left and pin up a verified post of
       your own, 4chan-tripcode style -- so the gold rush leaves a
       trail of conversation behind it, not just a leaderboard.
       Talking pays like walking does: open a silent thread and you
       strike +50, answer one nobody has answered yet and you strike
       +10, and every reply after that is +1. Say @name!trip in a
       post and that digger finds the thread in their inbox, which
       pays nothing and is not meant to -- see "Your inbox" below.
       
       You never leave the game to do any of this. diggings is a
       proxy: it fetches remote menus and pages and rewrites their
       links so a click carries you deeper without dropping out.
       An "exit" row is always there if you want to step back onto
       the open protocol -- the proxy is something you pass
       through, never a trap.
       
       It is the spiritual successor to the old `grpg`: same soul
       -- surf, discover, get rewarded, leave a mark -- with none
       of the battle/stats/death machinery.
       
       To do anything social you stake a name first. That is free,
       and the secret half of it is never stored, only hashed:
       
           printf '/applets/diggings/diggings.lhs/login\tyourname#yoursecret\r\n' \
             | nc gopher.someodd.zip 70
       
       That returns a one-row menu linking to your session selector,
       /applets/diggings/diggings.lhs/s/<token>. Bookmark it -- it is
       your login, and anyone holding it acts as you. Lose it and you
       just re-stake the same name#secret: same verified name!trip
       identity, fresh token.
       
       From your session menu you surf -- type a gopher location into
       the surf box and you are off, earning gold for new ground as
       you go. The bare URL /applets/diggings/diggings.lhs is the
       landing menu, and you can surf anonymously with no name at
       all; you simply earn no gold and cannot post.
       
       ------------------------------------------------------------
        What's hot
       ------------------------------------------------------------
       
       The front door and /applets/diggings/diggings.lhs/hot answer
       one question -- is anybody out there? -- and answer it with
       the only evidence here that proves a human turned up on
       purpose: a comment.
       
       A visit is a click. Clicks are cheap, half-automatable, and
       you produce them in bulk just walking a menu. A post had to
       be read up to, thought about, typed into a box, and be
       something nobody had already said on that thread. So the hot
       board ranks selectors by how many DIFFERENT diggers commented
       there in the last 30 days, and by nothing else. Ties go to
       whichever thread was spoken on most recently.
       
       Thirty days rather than a named month because it is true on
       every day of the year -- a calendar month reads "nothing yet"
       for its first week, and this server has gone two whole months
       without an event.
       
       It is a short board, and often a board of one. That is on
       purpose. One row reading "2 diggers talked here -- 2 days ago"
       is better proof that gopherspace is still inhabited than ten
       rows of somebody's afternoon crawl, and a quiet board is an
       opening, not a failure. Above it sits the other half of the
       claim, which is just counting:
       
           101 claims staked, 46 in the last 30 days, by 18 diggers.
       
       Under the ranked board sit the two panels that used to live
       on the leaderboard: the latest posts across every thread, and
       the most recent first-ever strikes. They are the same evidence
       unaggregated -- the ranking says where people have been
       talking, the posts say what was said and by whom, the strikes
       say the map is still filling in -- and they belong on the page
       that asks whether anybody is out there rather than on the page
       that keeps score. Talk is the scarce thing, so it sits above
       the walking.
       
       The leaderboard is now only a leaderboard: the gold ranks, the
       table of how gold is struck, and one line in the present
       tense: which hole the most diggers have actually walked this
       week. That line names a place and a count, never
       a person -- who is about is something you learn by standing
       in the same place as somebody, not by reading a board. It is
       left off entirely when only one digger has been out, for the
       same reason: one person's week is not a pulse.
       
       Only ground that diggings actually fetched can appear on the
       board. Reaching a menu or a text page means it was pulled down
       and checked; other item types -- images, binaries -- are taken
       on the link's word, never fetched, and so never qualify. That
       is a deliberately stricter test than the posting rules use,
       because this is the first screen a stranger sees and it is the
       one place a made-up location must not be able to buy its way
       onto.
       
       There is no archive of past months, and you lose nothing by
       that: nothing here is ever deleted, so any past window can be
       worked out exactly whenever somebody wants a scrapbook.
       
       ------------------------------------------------------------
        Your inbox
       ------------------------------------------------------------
       
       Write @name!trip in a post -- the whole verified identity,
       copied off one of their posts, with an @ in front of it -- and
       that digger finds the thread waiting in their inbox, at
       /applets/diggings/diggings.lhs/s/<token>/inbox. A row there is
       a date, the thread, and who wrote it; following it lands you
       on the thread, where the words are. Your session menu carries
       the inbox and, when something is new, one line saying so.
       
       A bare @name does nothing, on purpose. Names are not unique in
       the diggings -- two secrets can stake the same one, and the
       player table is keyed on the pair -- so a bare name is not a
       digger but a set, and delivering to the set would hand anyone
       who squats a popular name every word meant for anybody else.
       The trip is the half that says which digger you mean, and it
       is printed beside every post they have ever left, so calling
       somebody is copying rather than remembering. Names keep their
       case; trips are ten lowercase hex digits, no more and no
       fewer. A name run or a trip run of the wrong shape is refused
       whole rather than trimmed to fit, because trimming would
       quietly redirect a word meant for one digger into another
       digger's inbox. Write @@name!trip to say a name out without
       calling it. If a call misses, the page that took your post
       says so rather than leaving you to wonder.
       
       A call pays no gold, to either of you. Staking a name is free
       and unlimited, so any payout here would be a print-money
       button two identities could work between them forever; and
       gold is for walking new ground and for breaking silences,
       which a call is neither. The carrying post was already paid at
       its own tier.
       
       Nobody is called twice by the same post -- that is the table's
       primary key, not a rule the parser has to remember -- you
       cannot call yourself, and a post dropped as a duplicate calls
       nobody at all, for the same reason it pays nothing: the post
       box is an ordinary gopher selector, so a refresh or a "back"
       would otherwise be a cannon anybody could hold down. One post
       can call at most eight diggers; a post naming more is still
       stored whole, it simply stops delivering after eight.
       
       What the inbox shows is a date, a place and a name, never a
       word the caller chose. This is a private page an arbitrary
       stranger can cause to render, and keeping the rows to those
       three fields means the only parts a caller picks are which
       thread and which name, both already public. What was actually
       said stays on the thread, one click away.
       
       There is no mute list and no rate limit beyond the duplicate
       rule, and that is worth saying plainly rather than papering
       over. Three things blunt it: a call pays nothing, so there is
       no profit in it; a row carries no prose the caller chose; and
       posts are append-only, so anything written at you stays
       attributable to a name!trip for good. Note also that your
       session token now opens your mail as well as your gold --
       anyone holding it acts as you -- so /logout-all is the answer
       if a token of yours is loose.
       
       ------------------------------------------------------------
        What gold is struck for
       ------------------------------------------------------------
       
         +1     surf a selector you have never reached
         +100   ...and be the FIRST digger ever to reach it
         +50    open a thread -- the first post on a selector
         +10    leave the first reply on a thread
         +1     every reply after that
       
       The same table is printed in the game itself, at the foot of
       the /diggers leaderboard, and the posting half of it appears
       on your session menu, on every thread page and above the post
       box -- so you never have to come back here to check.
       
       Two conditions on the posting tiers. Undiscovered ground takes
       no posts at all: nobody can talk on a selector nobody has
       reached. Surf it once -- one click, and the walk pays you --
       and the thread opens. (Storing the post instead would quietly
       burn the +50 for everybody, since it would take the opening
       slot without anyone being paid for it.) And the +10 is for
       answering somebody else: open a thread and immediately reply
       to yourself and that reply is worth +1, like any other.
       
       Note what this does not promise. Gold is not farm-proof, and
       was not before: surfing an item type diggings does not fetch
       -- an image, a binary -- is taken on the link's word and pays
       the discovery bonus without anything being checked. That is
       an old, deliberate trade, and the posting tiers do not widen
       it, since that surf already pays more than a post does. The
       hot board applies a stricter test than the gold does.
       
       The posting tiers are a total, not a bonus on top of a base:
       the digger who opens a thread banks 50 and nothing more. Which
       tier you get is decided by your post's position in that thread
       -- first, second, or later -- so it is per thread, not per
       player and not per day: you can open a hundred different
       silent selectors and strike 50 on each, but you cannot strike
       50 twice on the same one. Two diggers racing to open the same
       thread resolve cleanly into one opener (+50) and one first
       replier (+10); nobody gets paid twice for the same rung.
       
       A post that is dropped as a duplicate is not a post, and pays
       nothing -- so a refresh, a "back", or re-sending the same line
       cannot farm gold. Neither can a wall of one-word replies to
       yourself: they are worth +1 each, the same as walking to a
       selector you have never seen, which is the point. Breaking a
       silence is the scarce act; adding to a conversation already
       under way is ordinary, honest work.
       
       ------------------------------------------------------------
        Endpoints
       ------------------------------------------------------------
       
       <loc> below is a base64url-encoded gopher location; <token> is
       a 32-hex-digit session token. You never type these by hand --
       they are produced for you and travel inside the menu links.
       
         /applets/diggings/diggings.lhs
               landing menu (gophermap)
       
         /applets/diggings/diggings.lhs/login<TAB>name#secret
               stake a name; returns a link to your session menu.
       
         /applets/diggings/diggings.lhs/hot
               what's hot: the selectors the most different diggers
               have commented on in the last 30 days, then the
               latest posts across all threads, then the most
               recent first-ever strikes.
       
         /applets/diggings/diggings.lhs/s/<token>/hot
               the same board, with your session carried through.
       
         /applets/diggings/diggings.lhs/s/<token>/inbox
               your inbox: every post that has called your name,
               newest first, and how calling works. Looking marks
               the page read; nothing else does.
       
         /applets/diggings/diggings.lhs/inbox
               no mail -- an inbox is addressed to a name!trip and
               there is no anonymous one -- just an explanation of
               what a call is and a box to stake a name in.
       
         /applets/diggings/diggings.lhs/diggers
               gold leaderboard, the table of how gold is struck,
               and a one-line note of which hole is busiest right
               now. (Recent strikes and the latest posts used to be
               here; they are on /hot now.)
       
         /applets/diggings/diggings.lhs/s/<token>/diggers
               the same leaderboard, but its links carry your token
               so a look never drops your session.
       
         /applets/diggings/diggings.lhs/s/<token>/logout
               kill this session link --- the durable name!trip and
               gold survive; re-stake name#secret for a fresh link.
       
         /applets/diggings/diggings.lhs/s/<token>/logout-all
               kill *every* session link for this name!trip --- useful
               when a token of yours is loose somewhere you no longer
               control. The durable identity (name!trip, gold) survives.
       
         /applets/diggings/diggings.lhs/s/<token>
               your session menu: who you are, your gold, whether
               anybody has called your name, what posting pays,
               what's hot right now, a surf box, a "resume" link,
               your inbox, the two boards.
       
         /applets/diggings/diggings.lhs/s/<token><TAB>host[:port][/sel]
               surf box: type a gopher location, jump straight into it
               as your session (this is how you earn gold).
       
         /applets/diggings/diggings.lhs/s/<token>/go/<loc>
               surf <loc> as you -- awards gold for new ground, touches
               presence, renders the proxied page under the overlay.
       
         /applets/diggings/diggings.lhs/s/<token>/thread/<loc>
               the thread page for <loc>: discoverer, who is here, a
               post box, the posts oldest-first.
       
         /applets/diggings/diggings.lhs/s/<token>/post/<loc><TAB>text
               leave `text` as a post on <loc>'s thread -- pays +50,
               +10 or +1 depending on where it lands in the thread
               (see "What gold is struck for" above). Any @name!trip
               in `text` puts the thread in that digger's inbox.
       
         /applets/diggings/diggings.lhs/go<TAB>host[:port][/sel]
               anonymous surf box: type a gopher location and jump
               into it with no name (earns no gold).
       
         /applets/diggings/diggings.lhs/go/<loc>
         /applets/diggings/diggings.lhs/thread/<loc>
               anonymous surf and anonymous (read-only) thread view --
               no gold, no posting, but you can still look around.
       
       ------------------------------------------------------------
        From the command line
       ------------------------------------------------------------
       
       Stake a name (the # splits display-name from the secret):
       
           printf '/applets/diggings/diggings.lhs/login\tsomeodd#hunter2\r\n' \
             | nc gopher.someodd.zip 70
       
       Surf a hole anonymously (no name needed, earns nothing):
       
           printf '/applets/diggings/diggings.lhs/go\tgopher.floodgap.com\r\n' \
             | nc gopher.someodd.zip 70
       
       Read the leaderboard:
       
           curl gopher://gopher.someodd.zip/1/applets/diggings/diggings.lhs/diggers
       
       Everything else -- surfing as a session, reading threads,
       posting -- is reachable by following the links inside those
       pages; the encoded <loc> and <token> segments are filled in for
       you.
       
       ------------------------------------------------------------
        How this works
       ------------------------------------------------------------
       
       State lives in one SQLite file, .diggings.db, seven tables,
       opened in WAL mode with a busy_timeout. Every gopher request
       spawns a fresh
       short-lived process, so the many concurrent readers and the
       occasional writer cannot share process memory -- WAL plus the
       atomicity of a single write statement is the entire concurrency
       story.
       Two players racing to be a selector's first discoverer both run
       the same insert; exactly one wins the bonus. No lock files.
       
       A tripcode is the classic stateless identity: name#secret
       yields name!trip, where trip is a salted hash of the secret.
       Same secret always yields the same trip; nobody without the
       secret can forge it; the secret itself is never written down.
       The session token is a convenience layer on top -- a random
       bearer credential mapped to your (name, trip) so you do not
       retype the secret every action.
       
       The proxy fetches remote menus with curl. A remote row of an
       enterable type (1 menu, 0 text) is rewritten to point back
       through diggings carrying your token; every other type --
       searches, binaries, images, URL: rows -- is left pointing at
       the origin server, because proxying those is either broken or
       pointless.
       
       Every surfed page, and every thread page, also carries one row
       that points straight back out -- "exit diggings, open this
       page on its own server" -- so the proxy is something you step
       through, never something you are stuck in. The surf overlay
       also carries a "strike out" box --- type a gopher location
       and jump straight to a fresh hole --- plus a row home to
       your session menu. And every page a player has reached shows
       a "first found by name!trip" credit -- and, once more than one
       digger has been through, a count of how many: on its thread
       page, and in the overlay each time anyone surfs it.
       
       ------------------------------------------------------------
        Limits
       ------------------------------------------------------------
       
       Gold is a leaderboard score; it does not buy anything yet.
       
       There is no quality signal anywhere in diggings -- no votes,
       no likes, no scoring of selectors or posts. It rewards
       reaching new ground, not endorsing good ground: gamified
       discovery, not gamified taste. The posts are a trail you
       leave, not a score you chase. (Adding upvotes would quietly
       turn it back into an engagement contest -- which is exactly
       what it is not.)
       
       The hot board does order selectors, and that line still
       holds: it reports attendance, not opinion. Nobody rates
       anything; it counts who turned up and says so. It also cannot
       compound the way a popularity chart does, because a digger is
       only ever counted once per thread per window -- a place runs
       out of new people to count and drops off, so the board turns
       over instead of crowning a favourite.
       
       Personal gold never depletes -- you earn +1 for any selector
       *you* have not visited, forever, and +1 for any reply you leave
       on a thread already under way. The bonuses are the scarce part:
       +100 for a first-ever discovery, +50 for opening a thread, +10
       for the first reply to one. Each is settled the moment it is
       claimed -- once a selector has a discoverer, an opener, or a
       first reply, that rung is gone for good and everyone after gets
       +1. Gold is only awarded for a selector that actually
       resolves to something -- a fetch that fails, comes back empty,
       or is just a "not found" error row earns nothing and records no
       discovery, so dead selectors cannot be farmed.
       
       Type-7 boxes accept either a name#secret stake or a typed
       gopher location depending on the box; malformed input comes
       back as a type-3 error row plus a link back. Names are capped
       at 24 characters ([A-Za-z0-9_-]); posts at 2 KiB.
       
       A thread holds one copy of any given post. Send text that is
       already on that thread -- yours or anyone else's, from a
       minute ago or a year ago -- and nothing is added and nothing
       is paid; the page tells you to be more original. This also quietly fixes the
       mechanical case, since a post box is an ordinary gopher
       selector and a refresh or a "back" would otherwise re-submit
       the whole post. The match is byte-exact, so different casing
       or punctuation is a different post.
       
       Anonymous surfing renders the proxy and overlay but earns no
       gold and cannot post -- everything social needs a staked name.
       
       Disconnecting mid-request just unwinds the process; there is
       no long-lived stream here, every response is a finite gophermap.
       
   BIN README.txt.bak-20260817                     15.7KB  2026-08-09
   DIR diggings.lhs                               125.2KB  2026-08-18
   BIN diggings.lhs.bak-20260806                   65.9KB  2026-06-23
   BIN diggings.lhs.bak-20260806b                  68.1KB  2026-08-06
   BIN diggings.lhs.bak-20260806c                  70.5KB  2026-08-06
   BIN diggings.lhs.bak-20260806d                  71.0KB  2026-08-06
   BIN diggings.lhs.bak-20260817                   98.8KB  2026-08-09