Skip to content

The web & remote access

Need a recipe? Use JEI in game. Need a starting route? Start here

Not out yet

Not out yet. In the development build; not in the 0.6.0 download.

Hard Hoof computers have a network of their own: cards, Routers, the Exchange. The Outernet is the world beyond this one, the real internet. Two things cross into it, and both go through one block, the Internet Dish.

Read real web pages on a Terminal with the Browser app, web or fetch, or from your own program with the web library. Reach a computer from outside the game by its Inter-Dimensional Address (IDA), with Hard Hoof Studio.

The dish fetches and decodes. Everything else is Volt on /rom: the Browser, the login, the file service. You can read it, copy it and change it. Java only keeps the server safe.

The Internet Dish

A dish on a mast. It is a bus device like any machine: put it against a computer, or anywhere on the computer's Data Cable network. One dish serves every computer that can reach it.

Device kind internet
Power DC, 2 W while on, 8 W while a transfer runs. No power means offline.
Craft Machine Workshop: a Data Cable, a Logic Board, two Copper Contacts, a Lead-Glass Casing and a Motor. JEI shows the layout.
Screen Shows only: online or why not, requests running, the last few host names reached. It has no buttons.

Controls live in programs: the Browser, web, fetch, or your own Volt.

Read a page

First working example

  1. Put an Internet Dish against a powered Terminal (or on its Data Cable) and give the dish power.
  2. In a shell, type fetch example.com. The page prints as text, with its links numbered at the end.
  3. Open the Browser app, press Ctrl+L, type an address and press Enter. Words that are not an address search the web.

No scheme means https. Pages come back as text, links, forms and small pictures. There is no video, no script and no plugin. Everything is plain ASCII: accents are dropped and fancy quotes and dashes become plain ones.

The Browser

Action How
Go to an address Ctrl+L, type, Enter
Follow a link Click. Middle-click opens a new tab. Right-click to open or copy.
Back, forward, reload Alt+Left (or Backspace), Alt+Right, F5 or Ctrl+R
Tabs Ctrl+T, Ctrl+W, Ctrl+PageDown and Ctrl+PageUp
Bookmarks, history Ctrl+D, Ctrl+H. Both are text files in /home/.browser.
Find in page; walk links Ctrl+F (Enter next, Shift+Enter back); Tab and Shift+Tab walk links and fields

Forms work (text fields, boxes, lists; GET and POST). Pictures arrive as small tiles once they scroll into view. The page stays on the dish and the Browser keeps only the part near the screen, so a 64 KB Terminal holds about 4 tabs and 3 pictures; more RAM keeps more.

about:home lists bookmarks and recent pages, about:help shows every manual as pages (it works with no dish), and about:history lists what you opened. With no dish the Browser says how to connect one. It never fails.

Commands

web <address or words> opens the Browser. fetch <address> prints a page as text; fetch -r prints the body as the site sent it and fetch -h the status, type, size and where redirects ended. open <address> opens the Browser too. man web has the full manual.

From your own program

/rom/lib/web.volt finds the dish and does the waiting:

let web = import("web")
let d = web.dish()                       // the first dish, or null
let p = web.get("https://example.com")   // waits; throws the reason on failure
let first = dev.call(d, "blocks", p.request, 0, 32)
web.forget(p.request)                    // free it on the dish

Also there: web.page(url), web.resolve(base, href), web.encode(map), web.address(typed). The dish's own operations (fetch, poll, blocks, links, forms, text, image, pixels, forget) are listed in man api. Errors are ordinary Volt errors you can catch: offline: no power, refused: private address, timed out, not found (404) and so on.

Limits and server settings

Safe by default. The dish never reaches private, local or LAN addresses, and by default only ports 80, 443, 8080 and 8443. Each redirect hop is checked again. Fetches run on worker threads, never on the server thread, shared fairly between dishes. Fixed in the mod: a page is cut past 16,384 blocks, 4,096 links, 1,024 pictures or 64 forms; a picture is at most 4096 by 4096 pixels (a GIF's first frame only); decoding gets 3 seconds; a request body is at most 64 KB.

A server owner edits config/hardhoof_tech-common.toml, section [outernet]. Changes apply without a restart.

Setting Default Meaning
enabled true false: every dish reports that web access is off
block_private_addresses true Never reach loopback, LAN, link-local or metadata addresses
allowed_ports 80, 443, 8080, 8443 Ports a dish may connect to
max_page_bytes, timeout_seconds, max_redirects 2,000,000, 15, 5 Page size after decompression, one deadline for the whole fetch, redirects followed
max_active_per_dish 3 Fetches at once on one dish
requests_per_minute_per_dish, requests_per_minute_server 30, 300 Rates
deny_hosts, allow_hosts none Suffix match: example.com also covers a.example.com. If allow_hosts is not empty, only those hosts.

Remote access

Every computer (Terminal, rack bay, Research Lab, Router) gets an Inter-Dimensional Address the first time something asks: eight characters like K7Q4-MX2R. It is random and never says where the computer stands. Typing is forgiving: lower case and no hyphen both work. Studio takes the full form ida://<server>/<IDA>, or the server and the IDA apart.

To be reachable a computer needs: an Internet Dish on its cables, power, and a program listening. remoted is that program and starts on every computer.

Pair Studio with you

  1. Stand at any computer and type remote pair (or use the Remote app, or the chat command /hardhoof remote pair).
  2. A one-use code like QX7M-2KD9 appears in your own chat, good for 10 minutes. It is never given to the computer, so a program on someone else's computer cannot pair Studio as you.
  3. In Studio, choose Connect and give the server's address and the code.

Studio then keeps a token that says "this is you on this server". The server stores only a hash. You do not need the code again. A computer makes a code only for a player who typed at it in person in the last 30 seconds, within 8 blocks.

In chat: /hardhoof remote shows the port, address, server fingerprint, your tokens and sessions; /hardhoof remote tokens lists your tokens and /hardhoof remote revoke <id or all> ends them. Operators also have /hardhoof remote sessions and /hardhoof remote kick <player>. The link is encrypted. Studio remembers the server's fingerprint the first time and warns if it ever changes, like SSH.

Who may get in

A token only says who you are. Getting into a computer is the computer's business: remoted asks for a login against that computer's /etc/passwd. The remote command edits /etc/remote.cfg.

  • remote shows the IDA, address, fingerprint, dish, access mode and sessions.
  • remote access login: a user of the computer logs in first (the default once it has users). open: anyone paired who has the IDA. off: every channel refused.
  • remote allow <player>: only listed players may even try (allow all clears it). remote deny <player>: never this player (deny none clears it).
  • remote kick <channel> ends a session.

Three wrong passwords lock a channel for 30 seconds. man remote has the rest.

The remote port

The server opens a WebSocket port, default 25590 (the next free one up to +9 if taken). In single player it listens only on your own machine. On a dedicated server it listens on every interface, so open that TCP port for your players.

[remote] in the same config file: enabled, port, bind, public_address, max_connections (64), max_connections_per_player (4), max_channels_per_connection (8), pair_code_minutes (10), keep_awake. With keep_awake on, an open channel keeps a dedicated server from pausing when empty, and single player from pausing when the window loses focus.

Safety and hacking

  • Hacking is allowed. remoted is plain Volt: copy it to /startup.volt and change it, or break into someone else's. The server stops only what could hurt it: private addresses, rates, sizes, and who may pair.
  • Pairing codes appear only in the player's own chat, and nothing reveals a computer's coordinates. Every limit is per dish, per player and per server. Banned and un-whitelisted players are refused.

Not here yet

Video, scripts, uploads, in-game web servers reached from the Outernet, and real traffic through a Router. Remote channels end when the server restarts. None of this has an in-game verdict yet.

↑↓ move↵ openesc close