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. 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/. 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. The leaderboard carries the same question in the present tense, in one line: 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. ------------------------------------------------------------ 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 ------------------------------------------------------------ below is a base64url-encoded gopher location; 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/loginname#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. /applets/diggings/diggings.lhs/s//hot the same board, with your session carried through. /applets/diggings/diggings.lhs/diggers gold leaderboard, most recent first-ever discoveries, the latest posts across all threads, and a one-line note of which hole is busiest right now. /applets/diggings/diggings.lhs/s//diggers the same leaderboard, but its links carry your token so a look never drops your session. /applets/diggings/diggings.lhs/s//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//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/ your session menu: who you are, your gold, what posting pays, what's hot right now, a surf box, a "resume" link, the leaderboard. /applets/diggings/diggings.lhs/s/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//go/ surf as you -- awards gold for new ground, touches presence, renders the proxied page under the overlay. /applets/diggings/diggings.lhs/s//thread/ the thread page for : discoverer, who is here, a post box, the posts oldest-first. /applets/diggings/diggings.lhs/s//post/text leave `text` as a post on 's thread -- pays +50, +10 or +1 depending on where it lands in the thread (see "What gold is struck for" above). /applets/diggings/diggings.lhs/gohost[:port][/sel] anonymous surf box: type a gopher location and jump into it with no name (earns no gold). /applets/diggings/diggings.lhs/go/ /applets/diggings/diggings.lhs/thread/ 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 and segments are filled in for you. ------------------------------------------------------------ How this works ------------------------------------------------------------ State lives in one SQLite file, .diggings.db, 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.