browser-terminal × vanilla JS

No framework, no build-time magic — just an ordinary page that registers a few TypeScript functions as shell commands. They read the live DOM, so the table you get back is this page.

6 links here / 2 more in the intro / 1 with no text

Try

links --help       # every command gets this for free
links rust         # the optional positional
links --internal   # a switch
links | filter {|o| $o.text != ''} | head 5
links | map @host
links | grep rust --on href
links | sort-by text | head 3
slow 5             # log is plain, err is red; Ctrl-C aborts
slow 5 | length    # diagnostics never enter the pipe
fail               # rich errors from TypeScript
mux                # a command group: lists its subcommands
help               # every command, builtin and registered
watch click | map type | head 3    # click 3 times; stops, listener removed
progress           # byte mode + \r: redraws in place
vars               # name, scope, value — scope shows shadowing
describe $project  # a record, passed as a variable
echo $scope_demo   # 'session' here; 'host' after `session new`

How it's implemented

Extracted from this page's own source at build time — not a transcription.

What that buys you

No command registers a --help flag. The evaluator intercepts it before argument binding and renders the signature, so the pages below are generated from the summary and desc strings in the code above — printed by the live engine on this page, not pasted in.

The same commands work in React and Svelte; those demos show how to reach component state from a command. Here there is no state to reach — the DOM is the state. This sentence holds the page's only same-origin links — jump to Try and jump to help — which is what links --internal narrows to.