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
- Put an Internet Dish against a powered Terminal (or on its Data Cable) and give the dish power.
- In a shell, type
fetch example.com. The page prints as text, with its links numbered at the end. - 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
- Stand at any computer and type
remote pair(or use the Remote app, or the chat command/hardhoof remote pair). - A one-use code like
QX7M-2KD9appears 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. - 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.
-
remoteshows 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 allclears it).remote deny <player>: never this player (deny noneclears 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.
remotedis plain Volt: copy it to/startup.voltand 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.