{"ok":true,"site":{"host":"trynix.dev","url":"https://trynix.dev/","type":"live","desc":"Boot anything nixpkgs ever shipped, in your browser: qemu-wasm plus the nixpkgs-multiverse index, no server anywhere.","tools":[{"name":"page-state","kind":"answer","impl":"imperative","description":"What trynix currently has: whether a guest is running, which packages are selected, and the link that reproduces this page.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/?pkg=hello","/?pkg=ripgrep&pkg=jq","/?pkg=python3@3.6.2","/?pkg=jujutsu@0.43.0","/?pkg=hello@2.10&pkg=hello@2.12.2"]},{"name":"search-packages","kind":"answer","impl":"imperative","description":"Search the nixpkgs-multiverse index for attribute names. Covers every package in 13 years of nixpkgs history, not only the current release.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"part of an attribute name"},"limit":{"type":"integer","description":"how many to return (default 20)"}},"required":["query"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/?pkg=hello","/?pkg=ripgrep&pkg=jq","/?pkg=python3@3.6.2","/?pkg=jujutsu@0.43.0","/?pkg=hello@2.10&pkg=hello@2.12.2"]},{"name":"list-versions","kind":"answer","impl":"imperative","description":"Every version of one attribute that nixpkgs ever shipped, newest first, each marked with whether Hydra built it for x86_64-linux. A version with no build cannot be booted: there is nothing in the cache to fetch.","inputSchema":{"type":"object","properties":{"attr":{"type":"string","description":"an attribute name, e.g. ripgrep"}},"required":["attr"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/?pkg=hello","/?pkg=ripgrep&pkg=jq","/?pkg=python3@3.6.2","/?pkg=jujutsu@0.43.0","/?pkg=hello@2.10&pkg=hello@2.12.2"]},{"name":"select-packages","kind":"act","impl":"imperative","description":"Add packages or raw store paths to the selection. A package named without a version takes the newest one the index can boot. Selecting does not boot; call boot afterwards.","inputSchema":{"type":"object","properties":{"packages":{"type":"array","description":"attributes to select, optionally at a version","items":{"type":"object","properties":{"attr":{"type":"string"},"version":{"type":"string"}},"required":["attr"]}},"storePaths":{"type":"array","description":"store paths to select verbatim","items":{"type":"string"}}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/?pkg=hello","/?pkg=ripgrep&pkg=jq","/?pkg=python3@3.6.2","/?pkg=jujutsu@0.43.0","/?pkg=hello@2.10&pkg=hello@2.12.2"]},{"name":"set-caches","kind":"act","impl":"imperative","description":"Replace the extra binary caches trynix fetches from, each with the public key that vouches for it. cache.nixos.org is always tried first and is not listed here. A cache is only reachable from a browser if it allows cross-origin reads, which cachix does.","inputSchema":{"type":"object","properties":{"caches":{"type":"array","description":"the extra caches, in the order to try them","items":{"type":"object","properties":{"url":{"type":"string","description":"e.g. https://my-cache.cachix.org"},"key":{"type":"string","description":"its public key, e.g. my-cache.cachix.org-1:0Ma9…"}},"required":["url","key"]}}},"required":["caches"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/?pkg=hello","/?pkg=ripgrep&pkg=jq","/?pkg=python3@3.6.2","/?pkg=jujutsu@0.43.0","/?pkg=hello@2.10&pkg=hello@2.12.2"]},{"name":"boot","kind":"act","impl":"imperative","description":"Boot the selection in the tab: fetch its closure from cache.nixos.org into an x86_64 Linux VM and wait for a shell. Takes a few seconds on a warm cache and much longer on a cold one. Once a guest is running, selecting more packages and calling boot again adds them without rebooting.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/?pkg=hello","/?pkg=ripgrep&pkg=jq","/?pkg=python3@3.6.2","/?pkg=jujutsu@0.43.0","/?pkg=hello@2.10&pkg=hello@2.12.2"]},{"name":"run-command","kind":"act","impl":"imperative","description":"Run a shell command in the running guest and return its output and exit status. This is the only way to read the guest's console: the terminal is drawn on a canvas, so nothing it prints is in the page's DOM.","inputSchema":{"type":"object","properties":{"command":{"type":"string","description":"the command to run"},"timeoutMs":{"type":"integer","description":"how long to wait before returning what it has printed so far"}},"required":["command"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/?pkg=hello","/?pkg=ripgrep&pkg=jq","/?pkg=python3@3.6.2","/?pkg=jujutsu@0.43.0","/?pkg=hello@2.10&pkg=hello@2.12.2"]},{"name":"read-console","kind":"answer","impl":"imperative","description":"Everything the guest has said so far, boot messages included. Use this when a boot or a command went wrong and the reason is further back than the last command's output.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/?pkg=hello","/?pkg=ripgrep&pkg=jq","/?pkg=python3@3.6.2","/?pkg=jujutsu@0.43.0","/?pkg=hello@2.10&pkg=hello@2.12.2"]}],"category":"Developer Tools","favicon":"/favicons/trynix.dev.svg","apiSurface":"spec","toolCount":8}}