<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Restish</title><link>https://rest.sh/</link><description>Recent content on Restish</description><generator>Hugo</generator><language>en-US</language><atom:link href="https://rest.sh/index.xml" rel="self" type="application/rss+xml"/><item><title>Commands</title><link>https://rest.sh/docs/reference/commands/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/commands/</guid><description>&lt;p&gt;Restish commands fall into a few groups: generic HTTP requests, API management,
configuration and setup, utilities, generated API commands, and plugin
commands. Run any command with &lt;code&gt;--help&lt;/code&gt; for exact flags and operational notes.&lt;/p&gt;
&lt;h2 id="generic-http-commands"&gt;Generic HTTP Commands&lt;/h2&gt;
&lt;p&gt;Use generic HTTP commands for one-off requests or APIs without a useful
OpenAPI description.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish get api.rest.sh/get
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish post api.rest.sh/post &lt;span class="s1"&gt;&amp;#39;name: Alice&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish patch api.rest.sh/patch &lt;span class="s1"&gt;&amp;#39;enabled: false&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A bare URL without a body sends &lt;code&gt;GET&lt;/code&gt;. A bare URL with shorthand or stdin body
input sends &lt;code&gt;POST&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Development Setup</title><link>https://rest.sh/docs/contributing/development-setup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/contributing/development-setup/</guid><description>&lt;p&gt;Use this page when changing code, plugins, or docs in the Restish repository.&lt;/p&gt;
&lt;h2 id="build-the-cli"&gt;Build The CLI&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go build ./cmd/restish
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="build-plugin-binaries"&gt;Build Plugin Binaries&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go build ./cmd/restish-bulk
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go build ./cmd/restish-csv
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go build ./cmd/restish-mcp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go build ./cmd/restish-pkcs11
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="run-tests"&gt;Run Tests&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go &lt;span class="nb"&gt;test&lt;/span&gt; ./...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go &lt;span class="nb"&gt;test&lt;/span&gt; ./internal/cli/...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run the integration-tag suite before commits that touch CLI or plugin behavior:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go &lt;span class="nb"&gt;test&lt;/span&gt; -tags&lt;span class="o"&gt;=&lt;/span&gt;integration ./...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Use a temporary &lt;code&gt;GOCACHE&lt;/code&gt; when your environment needs an isolated cache:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GOCACHE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/restish-gocache go &lt;span class="nb"&gt;test&lt;/span&gt; ./...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="update-golden-files"&gt;Update Golden Files&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go &lt;span class="nb"&gt;test&lt;/span&gt; -update ./internal/output/...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="build-the-docs-site"&gt;Build The Docs Site&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go run ./cmd/restish-docgen --check
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo --source site --quiet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scripts/check-doc-links.rb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When command help, global flags, plugin protocol structs, or built-in command
plugins change, refresh the checked-in generated regions first:&lt;/p&gt;</description></item><item><title>Install and Use Plugins</title><link>https://rest.sh/docs/plugins/install-and-use/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/plugins/install-and-use/</guid><description>&lt;p&gt;This is the operator path for using plugins that already exist.&lt;/p&gt;
&lt;p&gt;Plugins are executable programs on your machine. Install and run them at your
own risk, from sources you trust. Restish checks the plugin manifest and
capabilities, but it does not sandbox plugin code or verify publisher identity.&lt;/p&gt;
&lt;h2 id="list-plugins"&gt;List Plugins&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish plugin list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run this first when an output format, command, auth method, or TLS signer is
missing.&lt;/p&gt;
&lt;h2 id="install-a-plugin"&gt;Install A Plugin&lt;/h2&gt;
&lt;p&gt;Install from the official Restish GitHub releases:&lt;/p&gt;</description></item><item><title>Requests</title><link>https://rest.sh/docs/guides/requests/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/requests/</guid><description>&lt;p&gt;Restish supports two request styles: generic HTTP requests for immediate access
and API-aware commands generated from an API description for repeated work.&lt;/p&gt;
&lt;h2 id="start-with-a-generic-request"&gt;Start With A Generic Request&lt;/h2&gt;
&lt;div class="restish-playground" data-restish-playground&gt;
 &lt;div class="restish-playground__bar"&gt;
 &lt;div&gt;
 &lt;span class="restish-playground__eyebrow"&gt;Browser preview&lt;/span&gt;
 &lt;p class="restish-playground__hint"&gt;Edit the command and run it from your browser against the live docs API.&lt;/p&gt;
 &lt;/div&gt;
 &lt;div class="restish-playground__actions"&gt;
 &lt;span class="restish-playground__state" data-restish-state&gt;Ready&lt;/span&gt;
 &lt;button class="restish-playground__button" type="button" data-restish-run aria-controls="restish-example-0-output"&gt;
 &lt;i class="fas fa-play" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;span&gt;Run&lt;/span&gt;
 &lt;/button&gt;
 &lt;button class="restish-playground__icon-button" type="button" data-restish-copy title="Copy command" aria-label="Copy command"&gt;
 &lt;i class="fas fa-copy" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;/button&gt;
 &lt;button class="restish-playground__icon-button" type="button" data-restish-reset title="Reset command" aria-label="Reset command"&gt;
 &lt;i class="fas fa-rotate-left" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;/button&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;label class="visually-hidden" for="restish-example-0-command"&gt;Restish command&lt;/label&gt;
 &lt;div class="restish-playground__terminal-line"&gt;
 &lt;span class="restish-playground__prompt" aria-hidden="true"&gt;$&lt;/span&gt;
 &lt;div class="restish-playground__command-wrap"&gt;
 &lt;div class="restish-playground__command-highlight" aria-hidden="true"&gt;&lt;code class="language-bash" data-restish-command-highlight&gt;restish api.rest.sh/get&lt;/code&gt;&lt;/div&gt;
 &lt;input id="restish-example-0-command" class="restish-playground__command" type="text" spellcheck="false" autocomplete="off" autocapitalize="off" value="restish api.rest.sh/get" data-restish-command&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;pre id="restish-example-0-output" class="restish-playground__output" aria-live="polite" hidden&gt;&lt;code class="language-readable" data-restish-output&gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;noscript&gt;
 &lt;p class="restish-playground__noscript"&gt;Enable JavaScript to run this example in the browser.&lt;/p&gt;</description></item><item><title>Tour of Restish</title><link>https://rest.sh/docs/getting-started/tour/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/getting-started/tour/</guid><description>&lt;p&gt;This tour shows the shape of Restish before you commit to a local setup. You
can run the examples in your browser against the live docs API at
&lt;code&gt;https://api.rest.sh&lt;/code&gt;, edit the commands, and then use the same commands in a
terminal after installing Restish.&lt;/p&gt;
&lt;p&gt;Restish is an API-aware HTTP CLI. It works as a direct request tool when you
have only a URL, and it can also learn an API from OpenAPI so repeated work gets
generated commands, auth, profiles, completions, filtering, pagination, and
output formats.&lt;/p&gt;</description></item><item><title>Generic HTTP Commands</title><link>https://rest.sh/docs/reference/http-commands/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/http-commands/</guid><description>&lt;p&gt;Generic HTTP commands work without API registration. They still use Restish
profiles, auth, TLS, retries, cache, filtering, pagination, and output.&lt;/p&gt;
&lt;h2 id="generated-command-reference"&gt;Generated Command Reference&lt;/h2&gt;
&lt;!-- BEGIN GENERATED: restish-docgen http-commands --&gt;
&lt;p&gt;Generated from the current Cobra command tree.&lt;/p&gt;
&lt;h3 id="restish-get"&gt;&lt;code&gt;restish get&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Perform an HTTP GET request&lt;/p&gt;
&lt;p&gt;Perform an HTTP &lt;code&gt;GET&lt;/code&gt; request against a full URL or registered API short-name URL.&lt;/p&gt;
&lt;p&gt;Use generic HTTP commands for one-off requests, scripting, and APIs that are not registered with &lt;code&gt;api connect&lt;/code&gt;. Restish still applies global request flags, profile settings for registered API short names, response normalization, output formatting, filtering, retries, caching, pagination, and plugin hooks.&lt;/p&gt;</description></item><item><title>Global Flags</title><link>https://rest.sh/docs/reference/global-flags/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/global-flags/</guid><description>&lt;p&gt;Global flags apply across generic requests, generated API commands, utilities,
and many plugin-delegated requests. Ordinary command help shows common flags;
&lt;code&gt;--help-all&lt;/code&gt; shows the full grouped reference:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish get --help
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish get --help-all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="generated-flag-reference"&gt;Generated Flag Reference&lt;/h2&gt;
&lt;!-- BEGIN GENERATED: restish-docgen global-flags --&gt;
&lt;p&gt;Generated from the current root persistent flags.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;--help-all&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Type: &lt;code&gt;bool&lt;/code&gt;; default: &lt;code&gt;false&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Show all inherited Restish flags in help&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;--rsh-auth&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Type: &lt;code&gt;string&lt;/code&gt;; default: none&lt;/p&gt;
&lt;p&gt;Generated operation auth override, e.g. &amp;ldquo;PartnerKey&amp;rdquo; or &amp;ldquo;UserOAuth+PartnerKey&amp;rdquo;&lt;/p&gt;</description></item><item><title>API Management</title><link>https://rest.sh/docs/reference/api-management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/api-management/</guid><description>&lt;p&gt;&lt;code&gt;restish api&lt;/code&gt; manages configured APIs and generated command sources.&lt;/p&gt;
&lt;h2 id="generated-command-reference"&gt;Generated Command Reference&lt;/h2&gt;
&lt;!-- BEGIN GENERATED: restish-docgen api-command --&gt;
&lt;p&gt;Generated from the current Cobra command tree.&lt;/p&gt;
&lt;h3 id="restish-api"&gt;&lt;code&gt;restish api&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Manage registered API configurations&lt;/p&gt;
&lt;p&gt;Manage APIs registered in the local Restish config.&lt;/p&gt;
&lt;p&gt;Registered APIs turn OpenAPI descriptions into generated commands with shell completion, persistent profiles, and auth-aware requests. Use &lt;code&gt;api connect&lt;/code&gt; to add an API, &lt;code&gt;api sync&lt;/code&gt; after its OpenAPI document changes, and &lt;code&gt;api set&lt;/code&gt; for local profile edits.&lt;/p&gt;</description></item><item><title>Config Command</title><link>https://rest.sh/docs/reference/config-command/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/config-command/</guid><description>&lt;p&gt;Use &lt;code&gt;restish config&lt;/code&gt; when you need to inspect or change local Restish state:
registered APIs, profiles, auth settings, cache preferences, plugin config,
and terminal themes.&lt;/p&gt;
&lt;p&gt;For field-level config structure and precedence, see &lt;a href="../config/"&gt;Config&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="common-examples"&gt;Common Examples&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish config path
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish config show
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish config show -o json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish config trust
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish config &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cache.max_size: 500MB&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish config theme list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish config theme &lt;span class="nb"&gt;set&lt;/span&gt; one-dark-pro
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish config theme reset
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Use &lt;code&gt;api set&lt;/code&gt; for edits that belong to one registered API. Use &lt;code&gt;config set&lt;/code&gt;
when the patch targets top-level config, shared auth profiles, cache settings,
plugin settings, or themes.&lt;/p&gt;</description></item><item><title>API Setup and Discovery</title><link>https://rest.sh/docs/guides/api-setup-and-discovery/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/api-setup-and-discovery/</guid><description>&lt;p&gt;Restish can call any URL, but registering an API gives you generated commands,
profiles, auth setup, spec caching, and completion.&lt;/p&gt;
&lt;h2 id="configure-by-discovery"&gt;Configure By Discovery&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api connect example api.rest.sh &lt;span class="s1"&gt;&amp;#39;prompt.api_key: docs-key&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish example --help
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restish looks for an OpenAPI description through well-known locations and link
relations, then caches the spec.&lt;/p&gt;
&lt;p&gt;Discovery is intentionally conservative. Restish trusts same-origin spec links
by default; use &lt;code&gt;--allow-cross-origin-spec&lt;/code&gt; only when you expect the API to
advertise its OpenAPI document from another host and you trust that host.
Cross-origin discovery still rejects private, loopback, link-local, multicast,
and unspecified follow targets unless the original API is already private or
local. Use &lt;code&gt;--spec&lt;/code&gt; when you need to name a private spec URL directly.&lt;/p&gt;</description></item><item><title>Cache Command</title><link>https://rest.sh/docs/reference/cache-command/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/cache-command/</guid><description>&lt;p&gt;Use &lt;code&gt;restish cache&lt;/code&gt; to inspect or clear cached HTTP responses. This cache is
separate from the OpenAPI spec cache and OAuth/auth token cache.&lt;/p&gt;
&lt;h2 id="common-examples"&gt;Common Examples&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish cache info
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish cache info -o json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish cache clear
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish cache clear example
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish cache clear --direct
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Use &lt;code&gt;api sync&lt;/code&gt; when you need to refresh a cached OpenAPI document. Use
&lt;code&gt;api auth logout&lt;/code&gt; when you need to clear cached auth tokens.&lt;/p&gt;
&lt;p&gt;Config and cache roots are separate. &lt;code&gt;RSH_CONFIG_DIR&lt;/code&gt; changes which config file
Restish reads, but it does not by itself isolate the HTTP/spec cache; set
&lt;code&gt;RSH_CACHE_DIR&lt;/code&gt; as well when tests, bug reports, or audits need a clean cache.&lt;/p&gt;</description></item><item><title>Example API</title><link>https://rest.sh/docs/reference/example-api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/example-api/</guid><description>&lt;p&gt;The docs use &lt;code&gt;api.rest.sh&lt;/code&gt; whenever a live endpoint makes a Restish workflow
clearer. Restish infers &lt;code&gt;https://&lt;/code&gt; for host-like request targets, while config
values and OpenAPI metadata still use full URLs. The API is intentionally broad:
it has OpenAPI discovery, request echoing, auth fixtures, forms, uploads,
streaming, pagination, retries, content negotiation, binary responses,
redirects, and safe CRUD examples.&lt;/p&gt;
&lt;p&gt;Configure it once when you want short API-aware commands:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api connect example api.rest.sh &lt;span class="s1"&gt;&amp;#39;prompt.api_key: docs-key&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish example --help
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Use a host-like URL when you want to stay in generic HTTP mode:&lt;/p&gt;</description></item><item><title>Doctor Command</title><link>https://rest.sh/docs/reference/doctor-command/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/doctor-command/</guid><description>&lt;p&gt;Use &lt;code&gt;restish doctor&lt;/code&gt; when behavior looks environment-specific: the wrong config
file is being read, permissions are suspicious, shell setup is incomplete,
plugins are missing, or a registered API needs a health check.&lt;/p&gt;
&lt;h2 id="common-examples"&gt;Common Examples&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish doctor
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish doctor -o json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish doctor api example
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish doctor api example --check-network
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish doctor plugin mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Prefer JSON output when attaching diagnostics to an issue or comparing results
across machines.&lt;/p&gt;
&lt;p&gt;TTY human output colorizes status words when terminal color is enabled. JSON
output is stable and uncolored.&lt;/p&gt;</description></item><item><title>OpenAPI Extensions and Generated Commands</title><link>https://rest.sh/docs/reference/openapi-cli-integration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/openapi-cli-integration/</guid><description>&lt;p&gt;Restish turns OpenAPI operations into CLI commands. This reference is for API
authors and maintainers who want the generated command surface to feel natural:
stable names, useful help, predictable parameters, auth setup, and documented
Restish extensions.&lt;/p&gt;
&lt;h2 id="minimum-good-operation"&gt;Minimum Good Operation&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/items/{item-id}:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;get&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;operationId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;getItem&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Get one item&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;item-id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;in&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;path&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;200&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Item&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This can become:&lt;/p&gt;</description></item><item><title>Shell Command</title><link>https://rest.sh/docs/reference/shell-command/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/shell-command/</guid><description>&lt;p&gt;Use &lt;code&gt;restish shell&lt;/code&gt; to configure interactive shell behavior and generate or
install completion scripts. Shell setup prevents URL, query, filter, and
shorthand characters from being rewritten before Restish sees them.&lt;/p&gt;
&lt;p&gt;For the workflow explanation, see &lt;a href="https://rest.sh/docs/getting-started/shell-setup/"&gt;Shell Setup&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="common-examples"&gt;Common Examples&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish shell setup zsh --dry-run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish shell setup zsh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish shell setup zsh --no-completion
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish shell completion zsh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish shell completion bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish shell completion install fish
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Quote URLs, filters, and shorthand in scripts even after shell setup. The
wrapper is for day-to-day interactive use.&lt;/p&gt;</description></item><item><title>Utility Commands</title><link>https://rest.sh/docs/reference/utility-commands/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/utility-commands/</guid><description>&lt;p&gt;Utility commands inspect supporting HTTP and runtime details without changing
remote resources. Use them to check TLS certificates, extract hypermedia links,
and report the Restish version.&lt;/p&gt;
&lt;h2 id="common-examples"&gt;Common Examples&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish cert api.rest.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish cert api.rest.sh --warn-days &lt;span class="m"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish links api.rest.sh/images next
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="generated-command-reference"&gt;Generated Command Reference&lt;/h2&gt;
&lt;!-- BEGIN GENERATED: restish-docgen utility-commands --&gt;
&lt;p&gt;Generated from the current Cobra command tree.&lt;/p&gt;
&lt;h3 id="restish-cert"&gt;&lt;code&gt;restish cert&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Show the TLS certificate chain for a server&lt;/p&gt;
&lt;p&gt;Show the TLS certificate chain for an HTTPS server.&lt;/p&gt;</description></item><item><title>Authentication</title><link>https://rest.sh/docs/guides/authentication/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/authentication/</guid><description>&lt;p&gt;Auth belongs with the request context. In Restish that usually means a profile,
so tokens, API keys, and environment-specific credentials do not get copied into
every command.&lt;/p&gt;
&lt;h2 id="safe-auth-fixtures"&gt;Safe Auth Fixtures&lt;/h2&gt;
&lt;p&gt;The example API has endpoints that require auth and return only a safe summary.
They are useful for learning and testing.&lt;/p&gt;
&lt;h3 id="bearer-token"&gt;Bearer Token&lt;/h3&gt;
&lt;div class="restish-playground" data-restish-playground&gt;
 &lt;div class="restish-playground__bar"&gt;
 &lt;div&gt;
 &lt;span class="restish-playground__eyebrow"&gt;Browser preview&lt;/span&gt;
 &lt;p class="restish-playground__hint"&gt;Edit the command and run it from your browser against the live docs API.&lt;/p&gt;
 &lt;/div&gt;
 &lt;div class="restish-playground__actions"&gt;
 &lt;span class="restish-playground__state" data-restish-state&gt;Ready&lt;/span&gt;
 &lt;button class="restish-playground__button" type="button" data-restish-run aria-controls="restish-example-0-output"&gt;
 &lt;i class="fas fa-play" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;span&gt;Run&lt;/span&gt;
 &lt;/button&gt;
 &lt;button class="restish-playground__icon-button" type="button" data-restish-copy title="Copy command" aria-label="Copy command"&gt;
 &lt;i class="fas fa-copy" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;/button&gt;
 &lt;button class="restish-playground__icon-button" type="button" data-restish-reset title="Reset command" aria-label="Reset command"&gt;
 &lt;i class="fas fa-rotate-left" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;/button&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;label class="visually-hidden" for="restish-example-0-command"&gt;Restish command&lt;/label&gt;
 &lt;div class="restish-playground__terminal-line"&gt;
 &lt;span class="restish-playground__prompt" aria-hidden="true"&gt;$&lt;/span&gt;
 &lt;div class="restish-playground__command-wrap"&gt;
 &lt;div class="restish-playground__command-highlight" aria-hidden="true"&gt;&lt;code class="language-bash" data-restish-command-highlight&gt;restish -H &amp;#39;Authorization: Bearer docs-token&amp;#39; api.rest.sh/auth/bearer --rsh-print b&lt;/code&gt;&lt;/div&gt;
 &lt;input id="restish-example-0-command" class="restish-playground__command" type="text" spellcheck="false" autocomplete="off" autocapitalize="off" value="restish -H &amp;#39;Authorization: Bearer docs-token&amp;#39; api.rest.sh/auth/bearer --rsh-print b" data-restish-command&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;pre id="restish-example-0-output" class="restish-playground__output" aria-live="polite" hidden&gt;&lt;code class="language-readable" data-restish-output&gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;noscript&gt;
 &lt;p class="restish-playground__noscript"&gt;Enable JavaScript to run this example in the browser.&lt;/p&gt;</description></item><item><title>Config</title><link>https://rest.sh/docs/reference/config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/config/</guid><description>&lt;p&gt;Restish config is the trust boundary for API base URLs, generated command
sources, profiles, auth, TLS, plugins, cache settings, and terminal-output
themes.&lt;/p&gt;
&lt;h2 id="location-and-selection"&gt;Location And Selection&lt;/h2&gt;
&lt;p&gt;Default config lives in a Restish config directory as &lt;code&gt;restish.json&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Platform&lt;/th&gt;
 &lt;th&gt;Default path&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;macOS, Linux, and other Unix-like systems&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;~/.config/restish/restish.json&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;%APPDATA%\restish\restish.json&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Config path precedence:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;--rsh-config &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RSH_CONFIG=&amp;lt;file&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RSH_CONFIG_DIR=&amp;lt;dir&amp;gt;/restish.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;XDG_CONFIG_HOME/restish/restish.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;platform default&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish --rsh-config ./restish.json api list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;RSH_CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;./restish.json restish api list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;An explicit config file is the whole source of truth for that invocation. If it
is missing, Restish errors instead of falling back to user config.&lt;/p&gt;</description></item><item><title>Design Records</title><link>https://rest.sh/docs/contributing/design-records/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/contributing/design-records/</guid><description>&lt;p&gt;Design records live in &lt;code&gt;docs/design/&lt;/code&gt;. They explain why Restish is shaped the
way it is: runtime boundaries, config, auth, TLS, OpenAPI command generation,
request execution, response normalization, plugins, security, and migration.&lt;/p&gt;
&lt;h2 id="when-to-read-them"&gt;When To Read Them&lt;/h2&gt;
&lt;p&gt;Read design records when you are changing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;persistent config or profile behavior&lt;/li&gt;
&lt;li&gt;auth, token storage, external tools, or OAuth flows&lt;/li&gt;
&lt;li&gt;TLS, mTLS, or signer plugins&lt;/li&gt;
&lt;li&gt;OpenAPI discovery or generated commands&lt;/li&gt;
&lt;li&gt;request execution order&lt;/li&gt;
&lt;li&gt;pagination, streaming, filtering, or output contracts&lt;/li&gt;
&lt;li&gt;plugin protocol or trust boundaries&lt;/li&gt;
&lt;li&gt;v1 compatibility and migration behavior&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="user-docs-trigger"&gt;User Docs Trigger&lt;/h2&gt;
&lt;p&gt;If a design record changes user-visible behavior, update the user docs in the
same work. Design records preserve intent; they do not replace guides,
recipes, or reference pages.&lt;/p&gt;</description></item><item><title>Built-In Example Plugins</title><link>https://rest.sh/docs/plugins/example-plugins/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/plugins/example-plugins/</guid><description>&lt;p&gt;The repository includes plugin binaries that are both useful tools and reference
implementations. Operators can use these to try real plugin behavior. Authors
can read them to see the smallest practical shape for each plugin category.&lt;/p&gt;
&lt;p&gt;If you are only trying to install and run a plugin, start with
&lt;a href="../install-and-use/"&gt;Install and Use Plugins&lt;/a&gt;. If you are writing one, read
the relevant author guide after finding the closest example here.&lt;/p&gt;
&lt;h2 id="operator-facing-plugins"&gt;Operator-Facing Plugins&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Plugin&lt;/th&gt;
 &lt;th&gt;Path&lt;/th&gt;
 &lt;th&gt;Use it for&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;restish-csv&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;cmd/restish-csv/main.go&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Render array responses as CSV.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;restish-bulk&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;cmd/restish-bulk/main.go&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Manage API collections as local files.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;restish-mcp&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;cmd/restish-mcp/main.go&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Serve registered APIs as MCP tools.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;restish-pkcs11&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;cmd/restish-pkcs11/main.go&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Sign mTLS handshakes with PKCS#11-backed keys.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These binaries are built like normal Go commands. Once installed where Restish
can discover them, they participate in the same plugin lifecycle as third-party
plugins.&lt;/p&gt;</description></item><item><title>Install</title><link>https://rest.sh/docs/getting-started/install/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/getting-started/install/</guid><description>&lt;p&gt;This page documents the Restish v2 install path. Homebrew is the recommended
managed install path for most macOS users. Build from source when you are
developing Restish itself or testing changes before they are released.&lt;/p&gt;
&lt;p&gt;Always verify the major version after installation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="homebrew"&gt;Homebrew&lt;/h2&gt;
&lt;p&gt;Use Homebrew for the easiest managed install on macOS:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install rest-sh/tap/restish
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The tap also keeps a legacy &lt;code&gt;restish@1&lt;/code&gt; formula available for users who
intentionally stay on v1 during migration.&lt;/p&gt;</description></item><item><title>Post JSON From a File</title><link>https://rest.sh/docs/recipes/post-json-from-a-file/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/recipes/post-json-from-a-file/</guid><description>&lt;p&gt;Use a file when the request body is too large or too important to type as
shorthand on the command line. Restish reads stdin, decodes the structured
document, and sends it as the request body.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish post api.rest.sh/post &amp;lt; payload.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Example &lt;code&gt;payload.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Alice&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;/post&lt;/code&gt; fixture echoes the parsed body so you can verify what was sent.&lt;/p&gt;
&lt;p&gt;Variant with explicit content type:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish post -c json api.rest.sh/post &amp;lt; payload.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The explicit &lt;code&gt;-c json&lt;/code&gt; form is useful when stdin comes from a source without a
clear extension or when a script should make the request encoding obvious. For
small bodies, &lt;a href="https://rest.sh/docs/reference/shorthand/"&gt;shorthand&lt;/a&gt; is usually faster.&lt;/p&gt;</description></item><item><title>Profiles</title><link>https://rest.sh/docs/reference/profiles/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/profiles/</guid><description>&lt;p&gt;Profiles are named request defaults. Most profiles live under an API entry and
let the same command run against different environments, auth contexts, headers,
query params, or TLS settings.&lt;/p&gt;
&lt;h2 id="example"&gt;Example&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsonc" data-lang="jsonc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;apis&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;base_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://api.rest.sh&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;profiles&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;headers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Accept: application/json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;debug&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;trace=docs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;headers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;X-Debug: true&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;auth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bearer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;params&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;env:DOCS_TOKEN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Use a profile with &lt;code&gt;-p&lt;/code&gt; or &lt;code&gt;RSH_PROFILE&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish -p json example list-images
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;RSH_PROFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;json restish example list-images
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The command-line flag wins over &lt;code&gt;RSH_PROFILE&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Environment Variables</title><link>https://rest.sh/docs/reference/environment-variables/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/environment-variables/</guid><description>&lt;p&gt;Environment variables are useful for local defaults and automation, but command
line flags should be used when one invocation must be explicit.&lt;/p&gt;
&lt;!-- BEGIN GENERATED: restish-docgen environment-variables --&gt;
&lt;p&gt;Generated from production source environment-variable usage plus Go&amp;rsquo;s standard proxy environment contract.&lt;/p&gt;
&lt;h3 id="config-and-profiles"&gt;Config And Profiles&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;th&gt;Source&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_CONFIG&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Explicit config file path. It selects one config file for the invocation.&lt;/td&gt;
 &lt;td&gt;config paths&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_CONFIG_DIR&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Config directory override; Restish uses &lt;code&gt;restish.json&lt;/code&gt; inside this directory.&lt;/td&gt;
 &lt;td&gt;config paths&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_CACHE_DIR&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;HTTP/spec cache directory override.&lt;/td&gt;
 &lt;td&gt;config paths&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;XDG_CONFIG_HOME&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Base config directory; Restish uses &lt;code&gt;$XDG_CONFIG_HOME/restish/restish.json&lt;/code&gt;.&lt;/td&gt;
 &lt;td&gt;config paths&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;XDG_CACHE_HOME&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Base cache directory; Restish uses &lt;code&gt;$XDG_CACHE_HOME/restish&lt;/code&gt;.&lt;/td&gt;
 &lt;td&gt;config paths&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_PROFILE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Default API profile name. The &lt;code&gt;--rsh-profile&lt;/code&gt; flag wins for one command.&lt;/td&gt;
 &lt;td&gt;global flags&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_AUTH&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Default generated-operation auth override, such as &lt;code&gt;PartnerKey&lt;/code&gt; or &lt;code&gt;UserOAuth+PartnerKey&lt;/code&gt;.&lt;/td&gt;
 &lt;td&gt;global flags&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="request-defaults"&gt;Request Defaults&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;th&gt;Source&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_HEADER&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Comma-separated default request headers in &lt;code&gt;Name: Value&lt;/code&gt; form; escape literal commas as &lt;code&gt;\,&lt;/code&gt;.&lt;/td&gt;
 &lt;td&gt;global flags&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_QUERY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Comma-separated default query parameters in &lt;code&gt;key=value&lt;/code&gt; form; escape literal commas as &lt;code&gt;\,&lt;/code&gt;.&lt;/td&gt;
 &lt;td&gt;global flags&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_TIMEOUT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Default request timeout such as &lt;code&gt;15s&lt;/code&gt;.&lt;/td&gt;
 &lt;td&gt;global flags&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_FILTER&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Default response filter expression.&lt;/td&gt;
 &lt;td&gt;global flags&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_NO_CACHE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Bypass HTTP cache where supported.&lt;/td&gt;
 &lt;td&gt;global flags&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_INSECURE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Disable TLS certificate verification when truthy.&lt;/td&gt;
 &lt;td&gt;global flags&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_RETRY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Default retry count where supported.&lt;/td&gt;
 &lt;td&gt;global flags&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_RETRY_UNSAFE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Allow retry replay for POST, PUT, PATCH, and DELETE when truthy.&lt;/td&gt;
 &lt;td&gt;global flags&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_RETRY_MAX_WAIT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Default cap for &lt;code&gt;Retry-After&lt;/code&gt; / &lt;code&gt;X-Retry-In&lt;/code&gt;, such as &lt;code&gt;30s&lt;/code&gt;.&lt;/td&gt;
 &lt;td&gt;global flags&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="editor-and-terminal"&gt;Editor And Terminal&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;th&gt;Source&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_OUTPUT_FORMAT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Default rendered body format for &lt;code&gt;-o&lt;/code&gt; / &lt;code&gt;--rsh-output-format&lt;/code&gt;.&lt;/td&gt;
 &lt;td&gt;global flags&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_PRINT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Default &lt;code&gt;--rsh-print&lt;/code&gt; output parts, such as &lt;code&gt;b&lt;/code&gt; for compact rendered output in scripts.&lt;/td&gt;
 &lt;td&gt;global flags&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;VISUAL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Preferred editor for &lt;code&gt;config edit&lt;/code&gt; and &lt;code&gt;edit&lt;/code&gt;.&lt;/td&gt;
 &lt;td&gt;editor&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;EDITOR&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Fallback editor for &lt;code&gt;config edit&lt;/code&gt; and &lt;code&gt;edit&lt;/code&gt;.&lt;/td&gt;
 &lt;td&gt;editor&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;GLAMOUR_STYLE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Markdown rendering style for markdown-formatted terminal output.&lt;/td&gt;
 &lt;td&gt;output&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_IMAGE_PROTOCOL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Force terminal image rendering protocol: &lt;code&gt;kitty&lt;/code&gt;, &lt;code&gt;iterm2&lt;/code&gt;, or &lt;code&gt;halfblock&lt;/code&gt;.&lt;/td&gt;
 &lt;td&gt;output&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KITTY_WINDOW_ID&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Used to auto-detect Kitty image support.&lt;/td&gt;
 &lt;td&gt;output&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;TERM&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Used to auto-detect Kitty terminal support.&lt;/td&gt;
 &lt;td&gt;output&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;TERM_PROGRAM&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Used to auto-detect iTerm2-style image support.&lt;/td&gt;
 &lt;td&gt;output&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;COLUMNS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Terminal width hint for half-block image rendering.&lt;/td&gt;
 &lt;td&gt;output&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;SHELL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Used for first-run shell setup hints.&lt;/td&gt;
 &lt;td&gt;shell setup&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;NO_COLOR&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Disable color where respected.&lt;/td&gt;
 &lt;td&gt;output&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;NOCOLOR&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Disable color; supported as an older spelling alongside &lt;code&gt;NO_COLOR&lt;/code&gt;.&lt;/td&gt;
 &lt;td&gt;output&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;COLOR&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Force color where respected.&lt;/td&gt;
 &lt;td&gt;output&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="plugin-runtime"&gt;Plugin Runtime&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;th&gt;Source&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_COMMAND_PLUGIN_DISCOVERY_TIMEOUT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Override command-plugin startup discovery timeout.&lt;/td&gt;
 &lt;td&gt;plugin runtime&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RSH_COMMAND_PLUGIN_SHUTDOWN_GRACE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Override command-plugin shutdown grace period.&lt;/td&gt;
 &lt;td&gt;plugin runtime&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="plugin-installation"&gt;Plugin Installation&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;th&gt;Source&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;GITHUB_TOKEN&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Bearer token used for GitHub release API requests during &lt;code&gt;restish plugin install owner/repo plugin&lt;/code&gt;.&lt;/td&gt;
 &lt;td&gt;plugin install&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="proxies"&gt;Proxies&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;th&gt;Source&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;HTTPS_PROXY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Standard Go HTTPS proxy setting used by Restish HTTP transports.&lt;/td&gt;
 &lt;td&gt;Go HTTP transport&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;HTTP_PROXY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Standard Go HTTP proxy setting used by Restish HTTP transports.&lt;/td&gt;
 &lt;td&gt;Go HTTP transport&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;NO_PROXY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Standard Go proxy bypass list used by Restish HTTP transports.&lt;/td&gt;
 &lt;td&gt;Go HTTP transport&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;!-- END GENERATED --&gt;
&lt;p&gt;Flags override environment defaults for one command. Restish also uses Go&amp;rsquo;s
standard proxy environment behavior:&lt;/p&gt;</description></item><item><title>Upload a File With Multipart</title><link>https://rest.sh/docs/recipes/upload-a-file-with-multipart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/recipes/upload-a-file-with-multipart/</guid><description>&lt;p&gt;Multipart requests are used for uploads that combine normal form fields with
file parts. &lt;code&gt;-c multipart&lt;/code&gt; chooses the request encoding, and &lt;code&gt;@upload.txt&lt;/code&gt;
tells Restish to send the file contents rather than the literal string.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hello from docs\n&amp;#39;&lt;/span&gt; &amp;gt; upload.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish post -c multipart api.rest.sh/uploads &lt;span class="s1"&gt;&amp;#39;description: docs, file: @upload.txt&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The response echoes multipart fields. If a client sends real file parts,
&lt;code&gt;/uploads&lt;/code&gt; also reports file metadata. Missing file paths fail before the
request is sent. Use &lt;code&gt;@@value&lt;/code&gt; when a text field should start with a literal
&lt;code&gt;@&lt;/code&gt;. For plain URL-encoded forms, use &lt;code&gt;-c form&lt;/code&gt; instead; both encodings are
explained in &lt;a href="https://rest.sh/docs/guides/input/"&gt;Input and Shorthand&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>OAuth</title><link>https://rest.sh/docs/guides/oauth/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/oauth/</guid><description>&lt;p&gt;Use this guide when an API uses OAuth and you need Restish to fetch, cache, and
refresh bearer tokens for a profile or generated OpenAPI credential.&lt;/p&gt;
&lt;p&gt;OAuth setup is provider-specific. Restish owns the local CLI workflow, token
cache, request header, and OpenAPI credential binding. Your identity provider
still owns client registration, redirect URI rules, scopes, consent, and token
policy.&lt;/p&gt;
&lt;h2 id="choose-a-flow"&gt;Choose A Flow&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Flow&lt;/th&gt;
 &lt;th&gt;Restish type&lt;/th&gt;
 &lt;th&gt;Use it when&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Client credentials&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;oauth-client-credentials&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;A script, service account, CI job, or machine-to-machine integration calls the API.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Authorization code with PKCE&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;oauth-authorization-code&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;A human signs in through a browser and grants access to their account.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Device code&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;oauth-device-code&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The terminal cannot receive a localhost browser callback, or the provider recommends device authorization for CLIs.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Use &lt;code&gt;external-tool&lt;/code&gt; instead when your organization already has an SSO helper or
request signer that should stay in charge of tokens.&lt;/p&gt;</description></item><item><title>Auth</title><link>https://rest.sh/docs/reference/auth/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/auth/</guid><description>&lt;p&gt;Auth configuration lives on a profile. Use &lt;code&gt;auth&lt;/code&gt; when one credential applies
to the API/profile, and use &lt;code&gt;credentials&lt;/code&gt; when generated OpenAPI operations
need different security schemes or alternatives.&lt;/p&gt;
&lt;h2 id="auth-types"&gt;Auth Types&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Required params&lt;/th&gt;
 &lt;th&gt;Optional params&lt;/th&gt;
 &lt;th&gt;Effect&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;bearer&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;token&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;Sets &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;http-basic&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;username&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;password&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Sets HTTP Basic auth. If &lt;code&gt;password&lt;/code&gt; is omitted and prompting is available, Restish prompts.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;api-key&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;in&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;value&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;Sends an API key in a &lt;code&gt;header&lt;/code&gt;, &lt;code&gt;query&lt;/code&gt;, or &lt;code&gt;cookie&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;oauth-client-credentials&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;client_id&lt;/code&gt;, &lt;code&gt;client_secret&lt;/code&gt;, plus &lt;code&gt;token_url&lt;/code&gt; or &lt;code&gt;issuer_url&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;auth_method&lt;/code&gt;, &lt;code&gt;scopes&lt;/code&gt;, provider-specific token params such as &lt;code&gt;audience&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Fetches and caches a bearer token with the OAuth client credentials flow.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;oauth-authorization-code&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;client_id&lt;/code&gt;, plus &lt;code&gt;authorize_url&lt;/code&gt; and &lt;code&gt;token_url&lt;/code&gt;, or &lt;code&gt;issuer_url&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;client_secret&lt;/code&gt;, &lt;code&gt;auth_method&lt;/code&gt;, &lt;code&gt;scopes&lt;/code&gt;, &lt;code&gt;redirect_scheme&lt;/code&gt;, &lt;code&gt;redirect_port&lt;/code&gt;, &lt;code&gt;redirect_path&lt;/code&gt;, &lt;code&gt;redirect_cert&lt;/code&gt;, &lt;code&gt;redirect_key&lt;/code&gt;, &lt;code&gt;callback_success_html&lt;/code&gt;, &lt;code&gt;callback_error_html&lt;/code&gt;, provider-specific token params&lt;/td&gt;
 &lt;td&gt;Runs an OAuth authorization-code flow with PKCE and caches the token.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;oauth-device-code&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;client_id&lt;/code&gt;, plus &lt;code&gt;device_authorization_url&lt;/code&gt; and &lt;code&gt;token_url&lt;/code&gt;, or &lt;code&gt;issuer_url&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;client_secret&lt;/code&gt;, &lt;code&gt;auth_method&lt;/code&gt;, &lt;code&gt;scopes&lt;/code&gt;, provider-specific token params&lt;/td&gt;
 &lt;td&gt;Runs the OAuth device-code flow and caches the token.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;external-tool&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;commandline&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;omitbody&lt;/code&gt;, &lt;code&gt;output&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Runs a local helper that can mutate request headers or URI.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;OAuth &lt;code&gt;auth_method&lt;/code&gt; accepts &lt;code&gt;client_secret_post&lt;/code&gt; by default or
&lt;code&gt;client_secret_basic&lt;/code&gt;. OAuth endpoints must use HTTPS except for localhost or
loopback development URLs. &lt;code&gt;issuer_url&lt;/code&gt; uses OIDC discovery when direct
endpoint URLs are absent. Unknown non-reserved OAuth params are forwarded to
token requests, which is how provider-specific values such as &lt;code&gt;audience&lt;/code&gt; are
sent.&lt;/p&gt;</description></item><item><title>Create, Patch, and Delete an Item Safely</title><link>https://rest.sh/docs/recipes/create-patch-and-delete-an-item-safely/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/recipes/create-patch-and-delete-an-item-safely/</guid><description>&lt;p&gt;This recipe practices a full create-update-delete loop against the public
example API. Because &lt;code&gt;/items&lt;/code&gt; is shared and resettable, use a unique ID so your
example does not collide with someone else&amp;rsquo;s state:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ITEM_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;docs-&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%s&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish post api.rest.sh/items &lt;span class="s2"&gt;&amp;#34;id: &lt;/span&gt;&lt;span class="nv"&gt;$ITEM_ID&lt;/span&gt;&lt;span class="s2"&gt;, name: Demo, enabled: true, updated: 2026-04-27T00:00:00Z&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish patch &lt;span class="s2"&gt;&amp;#34;api.rest.sh/items/&lt;/span&gt;&lt;span class="nv"&gt;$ITEM_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;enabled: false, tags[]: docs&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish delete &lt;span class="s2"&gt;&amp;#34;api.rest.sh/items/&lt;/span&gt;&lt;span class="nv"&gt;$ITEM_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; --rsh-ignore-status-code
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The first command creates an item from shorthand fields. The patch command sends
only the fields you want to change. The delete command uses
&lt;code&gt;--rsh-ignore-status-code&lt;/code&gt; so cleanup remains calm if the item is already gone;
see &lt;a href="https://rest.sh/docs/guides/command-behavior/"&gt;Command Behavior&lt;/a&gt; for how HTTP statuses
map to exit codes.&lt;/p&gt;</description></item><item><title>Plugin Quickstart</title><link>https://rest.sh/docs/plugins/quickstart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/plugins/quickstart/</guid><description>&lt;p&gt;This author-focused quickstart is for plugin developers. Operators should start
with &lt;a href="../install-and-use/"&gt;Install and Use Plugins&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The quickest way to write a plugin is to start from a working first-party
plugin, verify the manifest and message flow with &lt;code&gt;plugin debug&lt;/code&gt;, and then
change one capability at a time.&lt;/p&gt;
&lt;h2 id="author-path"&gt;Author Path&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Choose the smallest plugin type for the job.&lt;/li&gt;
&lt;li&gt;Build and install a known-good plugin locally.&lt;/li&gt;
&lt;li&gt;Verify discovery with &lt;code&gt;plugin list&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Inspect protocol messages with &lt;code&gt;plugin debug&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Change the manifest and implementation.&lt;/li&gt;
&lt;li&gt;Re-run the same discovery and behavior checks.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="choose-a-plugin-type"&gt;Choose A Plugin Type&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Formatter hook: easiest way to add an output format.&lt;/li&gt;
&lt;li&gt;Loader hook: add support for an API description format or source that Restish
does not load natively.&lt;/li&gt;
&lt;li&gt;Auth hook: integrate a local credential source that should participate in
Restish&amp;rsquo;s normal request pipeline.&lt;/li&gt;
&lt;li&gt;Request or response middleware: inspect or mutate prepared requests or
interpreted responses.&lt;/li&gt;
&lt;li&gt;Command plugin: add a top-level workflow such as &lt;code&gt;bulk&lt;/code&gt; or &lt;code&gt;mcp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;TLS signer: sign mTLS handshakes when the private key must stay outside
Restish.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Choose a hook when the plugin should do one focused job inside a request. Choose
a command plugin when the plugin owns a multi-step workflow and needs host
messages such as delegated HTTP, prompts, config reads, or formatted responses.&lt;/p&gt;</description></item><item><title>Content Types</title><link>https://rest.sh/docs/reference/content-types/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/content-types/</guid><description>&lt;p&gt;Restish separates two decisions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Request encoding: &lt;code&gt;-c&lt;/code&gt; or &lt;code&gt;--rsh-content-type&lt;/code&gt; controls how a request body is sent.&lt;/li&gt;
&lt;li&gt;Response rendering: &lt;code&gt;-o&lt;/code&gt; controls how a decoded response is printed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;HTTP &lt;code&gt;Accept&lt;/code&gt; headers ask the server for a representation. Output formats do
not change what the server sends.&lt;/p&gt;
&lt;h2 id="built-in-types"&gt;Built-In Types&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;restish doctor&lt;/code&gt; lists the registered content type aliases. Use JSON doctor
output when you need MIME types, suffixes, and quality values:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish doctor
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish doctor -o json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Alias&lt;/th&gt;
 &lt;th&gt;MIME types&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;application/json&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ndjson&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;application/x-ndjson&lt;/code&gt;, &lt;code&gt;application/ndjson&lt;/code&gt;, &lt;code&gt;application/jsonl&lt;/code&gt;, &lt;code&gt;application/jsonlines&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;xml&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;application/xml&lt;/code&gt;, &lt;code&gt;text/xml&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;yaml&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;application/yaml&lt;/code&gt;, &lt;code&gt;application/x-yaml&lt;/code&gt;, &lt;code&gt;text/yaml&lt;/code&gt;, &lt;code&gt;text/x-yaml&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;cbor&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;application/cbor&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;msgpack&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;application/msgpack&lt;/code&gt;, &lt;code&gt;application/x-msgpack&lt;/code&gt;, &lt;code&gt;application/vnd.msgpack&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;binary&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;application/octet-stream&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ion&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;application/ion&lt;/code&gt;, &lt;code&gt;text/ion&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;form&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;application/x-www-form-urlencoded&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;multipart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;multipart/form-data&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;sse&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;text/event-stream&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;text&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;text/plain&lt;/code&gt;, &lt;code&gt;text/*&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;JSON-family structured types with &lt;code&gt;+json&lt;/code&gt;, such as
&lt;code&gt;application/problem+json&lt;/code&gt;, decode as JSON. Structured suffixes win before broad
wildcards, so a response labeled &lt;code&gt;text/example+json&lt;/code&gt; is treated as JSON rather
than plain &lt;code&gt;text/*&lt;/code&gt; unless an exact handler is registered for that MIME type.
XML-family media types with &lt;code&gt;+xml&lt;/code&gt;, such as &lt;code&gt;application/soap+xml&lt;/code&gt;, use the XML
handler.&lt;/p&gt;</description></item><item><title>Docs Maintenance</title><link>https://rest.sh/docs/contributing/docs-maintenance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/contributing/docs-maintenance/</guid><description>&lt;p&gt;Use this page when you are changing user-facing behavior and need to make the
docs stay honest.&lt;/p&gt;
&lt;p&gt;This page is a maintenance workflow, not the source of truth for product
behavior. Current behavior comes from the CLI, tests, design records, and live
example API. When they disagree, update the docs and capture any remaining
follow-up in the project issue tracker or an active design record.&lt;/p&gt;
&lt;h2 id="before-you-edit"&gt;Before You Edit&lt;/h2&gt;
&lt;p&gt;Check the nearby docs before changing one page in isolation:&lt;/p&gt;</description></item><item><title>Hook Plugins</title><link>https://rest.sh/docs/plugins/hook-plugins/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/plugins/hook-plugins/</guid><description>&lt;p&gt;Hook plugins are short-lived extensions. Restish starts them for one focused
job, reads the result, and continues the host request pipeline.&lt;/p&gt;
&lt;h2 id="hook-types"&gt;Hook Types&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;auth&lt;/code&gt;: produce or mutate request auth.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;request-middleware&lt;/code&gt;: inspect or mutate outgoing requests.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;response-middleware&lt;/code&gt;: inspect or mutate incoming responses.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;loader&lt;/code&gt;: load API descriptions from additional content types or sources.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;formatter&lt;/code&gt;: render normalized responses as new output formats.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="formatter-example"&gt;Formatter Example&lt;/h2&gt;
&lt;p&gt;A CSV formatter should receive normalized response data and return terminal or
file output without owning HTTP, auth, retry, cache, or TLS behavior.&lt;/p&gt;</description></item><item><title>Input and Shorthand</title><link>https://rest.sh/docs/guides/input/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/input/</guid><description>&lt;p&gt;Restish shorthand lets you create structured request bodies directly on the
command line. JSON is the default request encoding, but the same body model can
be encoded as YAML, form data, multipart, CBOR, and other registered types.&lt;/p&gt;
&lt;h2 id="object-input"&gt;Object Input&lt;/h2&gt;
&lt;div class="restish-playground" data-restish-playground&gt;
 &lt;div class="restish-playground__bar"&gt;
 &lt;div&gt;
 &lt;span class="restish-playground__eyebrow"&gt;Browser preview&lt;/span&gt;
 &lt;p class="restish-playground__hint"&gt;Edit the command and run it from your browser against the live docs API.&lt;/p&gt;
 &lt;/div&gt;
 &lt;div class="restish-playground__actions"&gt;
 &lt;span class="restish-playground__state" data-restish-state&gt;Ready&lt;/span&gt;
 &lt;button class="restish-playground__button" type="button" data-restish-run aria-controls="restish-example-0-output"&gt;
 &lt;i class="fas fa-play" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;span&gt;Run&lt;/span&gt;
 &lt;/button&gt;
 &lt;button class="restish-playground__icon-button" type="button" data-restish-copy title="Copy command" aria-label="Copy command"&gt;
 &lt;i class="fas fa-copy" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;/button&gt;
 &lt;button class="restish-playground__icon-button" type="button" data-restish-reset title="Reset command" aria-label="Reset command"&gt;
 &lt;i class="fas fa-rotate-left" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;/button&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;label class="visually-hidden" for="restish-example-0-command"&gt;Restish command&lt;/label&gt;
 &lt;div class="restish-playground__terminal-line"&gt;
 &lt;span class="restish-playground__prompt" aria-hidden="true"&gt;$&lt;/span&gt;
 &lt;div class="restish-playground__command-wrap"&gt;
 &lt;div class="restish-playground__command-highlight" aria-hidden="true"&gt;&lt;code class="language-bash" data-restish-command-highlight&gt;restish post api.rest.sh/post &amp;#39;name: Alice, enabled: true, count: 3&amp;#39;&lt;/code&gt;&lt;/div&gt;
 &lt;input id="restish-example-0-command" class="restish-playground__command" type="text" spellcheck="false" autocomplete="off" autocapitalize="off" value="restish post api.rest.sh/post &amp;#39;name: Alice, enabled: true, count: 3&amp;#39;" data-restish-command&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;pre id="restish-example-0-output" class="restish-playground__output" aria-live="polite" hidden&gt;&lt;code class="language-readable" data-restish-output&gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;noscript&gt;
 &lt;p class="restish-playground__noscript"&gt;Enable JavaScript to run this example in the browser.&lt;/p&gt;</description></item><item><title>Output Formats</title><link>https://rest.sh/docs/reference/output-formats/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/output-formats/</guid><description>&lt;p&gt;Output formats decide how the selected body/value is rendered after decoding,
pagination or streaming, and filtering. They do not print HTTP status or
headers; use &lt;code&gt;--rsh-print&lt;/code&gt; for those exchange parts. They also do not change
request &lt;code&gt;Accept&lt;/code&gt; headers or server-side content negotiation. Redirected
rendered document output is pretty by default; pass &lt;code&gt;--rsh-print=b&lt;/code&gt; for compact
rendered JSON.&lt;/p&gt;
&lt;h2 id="document-formats"&gt;Document Formats&lt;/h2&gt;
&lt;p&gt;Document formats produce one coherent result:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Format&lt;/th&gt;
 &lt;th&gt;Use&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;auto&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Default body/value presentation.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;One JSON document.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;yaml&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;One YAML document.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;cbor&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;One CBOR document.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;gron&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Greppable path/value assignments.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;table&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Terminal table output for records or object collections.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Terminal image rendering for image responses.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/images -o auto
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/images --rsh-collect -o json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/images -o yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/example -o gron
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/images/png
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For redirects, unfiltered responses already write body bytes:&lt;/p&gt;</description></item><item><title>Output Defaults</title><link>https://rest.sh/docs/reference/output-defaults/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/output-defaults/</guid><description>&lt;p&gt;Restish chooses output defaults from context. Scripts should still pass &lt;code&gt;-o&lt;/code&gt;
when the expected shape matters.&lt;/p&gt;
&lt;h2 id="main-rule"&gt;Main Rule&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Context&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Interactive terminal, unfiltered response&lt;/td&gt;
 &lt;td&gt;response status, headers, and formatted body on stdout&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Redirected stdout, unfiltered response with no explicit output transform&lt;/td&gt;
 &lt;td&gt;response body bytes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Explicit filter selecting a scalar&lt;/td&gt;
 &lt;td&gt;plain scalar text&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Explicit filter selecting structured data&lt;/td&gt;
 &lt;td&gt;pretty JSON-shaped auto output&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Paginated items with no collect mode&lt;/td&gt;
 &lt;td&gt;stream item results as they arrive&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Live streams&lt;/td&gt;
 &lt;td&gt;record-oriented output; use &lt;code&gt;ndjson&lt;/code&gt; or &lt;code&gt;lines&lt;/code&gt; for scripts; plain &lt;code&gt;-o json&lt;/code&gt; requires &lt;code&gt;--rsh-collect&lt;/code&gt; and finite &lt;code&gt;--rsh-max-items&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="examples"&gt;Examples&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/images
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/images -o json &amp;gt; images.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/images/jpeg &amp;gt; dragonfly.jpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/formats/cbor &amp;gt; response.cbor
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/formats/cbor -o json &amp;gt; response.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/events --rsh-max-items &lt;span class="m"&gt;3&lt;/span&gt; -o ndjson
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Use &lt;code&gt;--rsh-print=b&lt;/code&gt; when a script wants compact rendered JSON instead of the
pretty default for transformed output:&lt;/p&gt;</description></item><item><title>Shorthand</title><link>https://rest.sh/docs/reference/shorthand/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/shorthand/</guid><description>&lt;p&gt;Shorthand is Restish&amp;rsquo;s compact structured-input language. It builds JSON-shaped
values for request bodies, patches structured stdin, and powers &lt;code&gt;config set&lt;/code&gt;,
&lt;code&gt;api set&lt;/code&gt;, and &lt;code&gt;edit&lt;/code&gt; patch arguments.&lt;/p&gt;
&lt;h2 id="quick-shape"&gt;Quick Shape&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Shorthand&lt;/th&gt;
 &lt;th&gt;Result&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;name: Alice&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;{&amp;quot;name&amp;quot;:&amp;quot;Alice&amp;quot;}&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;user.name: Alice&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;{&amp;quot;user&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;Alice&amp;quot;}}&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;tags[]: docs&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;{&amp;quot;tags&amp;quot;:[&amp;quot;docs&amp;quot;]}&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;items[0].name: first&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;{&amp;quot;items&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;first&amp;quot;}]}&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base{one: 1, two.three: 3}&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;{&amp;quot;base&amp;quot;:{&amp;quot;one&amp;quot;:1,&amp;quot;two&amp;quot;:{&amp;quot;three&amp;quot;:3}}}&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Use quotes around an entire shorthand argument when it contains spaces,
brackets, &lt;code&gt;?&lt;/code&gt;, &lt;code&gt;&amp;amp;&lt;/code&gt;, &lt;code&gt;|&lt;/code&gt;, or other shell-sensitive characters:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish post api.rest.sh/post &lt;span class="s1"&gt;&amp;#39;user.name: Alice, tags[]: docs&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="assignments"&gt;Assignments&lt;/h2&gt;
&lt;p&gt;An assignment is &lt;code&gt;path: value&lt;/code&gt;. Paths use dots for nested object fields and
brackets for array positions.&lt;/p&gt;</description></item><item><title>Get One Field From Every Item</title><link>https://rest.sh/docs/recipes/get-one-field-from-every-item/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/recipes/get-one-field-from-every-item/</guid><description>&lt;p&gt;This is the most common shell pattern: call a list endpoint, select one field
from each item, and print one plain value per line. It is useful for loops,
copy-paste, and quick checks.&lt;/p&gt;
&lt;div class="restish-playground" data-restish-playground&gt;
 &lt;div class="restish-playground__bar"&gt;
 &lt;div&gt;
 &lt;span class="restish-playground__eyebrow"&gt;Browser preview&lt;/span&gt;
 &lt;p class="restish-playground__hint"&gt;Edit the command and run it from your browser against the live docs API.&lt;/p&gt;
 &lt;/div&gt;
 &lt;div class="restish-playground__actions"&gt;
 &lt;span class="restish-playground__state" data-restish-state&gt;Ready&lt;/span&gt;
 &lt;button class="restish-playground__button" type="button" data-restish-run aria-controls="restish-example-0-output"&gt;
 &lt;i class="fas fa-play" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;span&gt;Run&lt;/span&gt;
 &lt;/button&gt;
 &lt;button class="restish-playground__icon-button" type="button" data-restish-copy title="Copy command" aria-label="Copy command"&gt;
 &lt;i class="fas fa-copy" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;/button&gt;
 &lt;button class="restish-playground__icon-button" type="button" data-restish-reset title="Reset command" aria-label="Reset command"&gt;
 &lt;i class="fas fa-rotate-left" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;/button&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;label class="visually-hidden" for="restish-example-0-command"&gt;Restish command&lt;/label&gt;
 &lt;div class="restish-playground__terminal-line"&gt;
 &lt;span class="restish-playground__prompt" aria-hidden="true"&gt;$&lt;/span&gt;
 &lt;div class="restish-playground__command-wrap"&gt;
 &lt;div class="restish-playground__command-highlight" aria-hidden="true"&gt;&lt;code class="language-bash" data-restish-command-highlight&gt;restish api.rest.sh/images -f body.self -o lines&lt;/code&gt;&lt;/div&gt;
 &lt;input id="restish-example-0-command" class="restish-playground__command" type="text" spellcheck="false" autocomplete="off" autocapitalize="off" value="restish api.rest.sh/images -f body.self -o lines" data-restish-command&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;pre id="restish-example-0-output" class="restish-playground__output" aria-live="polite" hidden&gt;&lt;code class="language-readable" data-restish-output&gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;noscript&gt;
 &lt;p class="restish-playground__noscript"&gt;Enable JavaScript to run this example in the browser.&lt;/p&gt;</description></item><item><title>Query Syntax</title><link>https://rest.sh/docs/reference/query-syntax/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/query-syntax/</guid><description>&lt;p&gt;Restish filters the normalized response before formatting. Use shorthand for
direct paths, projections, recursive search, and simple selection. Use jq for
larger transforms.&lt;/p&gt;
&lt;h2 id="roots"&gt;Roots&lt;/h2&gt;
&lt;p&gt;Most filters start from one of these normalized roots:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Root&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;status&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Numeric HTTP status code.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;headers&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;First value for each response header.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;headers_all&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Complete header map for repeated values. Use jq syntax such as &lt;code&gt;.headers_all[&amp;quot;Set-Cookie&amp;quot;]&lt;/code&gt; when you need it.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;links&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Normalized hypermedia links.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;body&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Decoded response body.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;proto&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;HTTP protocol string such as &lt;code&gt;HTTP/2.0&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/ -f headers.Content-Type
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/images -f links.next
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/example -f body.basics.profiles
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="paths-and-indexes"&gt;Paths And Indexes&lt;/h2&gt;
&lt;p&gt;Use dots for object fields and brackets for array positions:&lt;/p&gt;</description></item><item><title>Shell Setup</title><link>https://rest.sh/docs/getting-started/shell-setup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/getting-started/shell-setup/</guid><description>&lt;p&gt;Restish uses characters that shells also care about: &lt;code&gt;?&lt;/code&gt;, &lt;code&gt;&amp;amp;&lt;/code&gt;, &lt;code&gt;[&lt;/code&gt;, &lt;code&gt;]&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;,
quotes, and spaces. Shell setup prevents the shell from rewriting request URLs,
query strings, filters, and shorthand before Restish can parse them.&lt;/p&gt;
&lt;h2 id="configure-the-wrapper"&gt;Configure The Wrapper&lt;/h2&gt;
&lt;p&gt;Run the setup command for your shell:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish shell setup zsh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish shell setup bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish shell setup fish
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For zsh and fish, setup installs completion by default. Opt out when you only
want the wrapper:&lt;/p&gt;</description></item><item><title>Bulk Command</title><link>https://rest.sh/docs/reference/bulk-command/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/bulk-command/</guid><description>&lt;p&gt;&lt;code&gt;restish-bulk&lt;/code&gt; is a command plugin for workflows where a collection needs to be
pulled down, edited locally, and pushed back in a controlled way. It is useful
for repeatable content or data maintenance tasks where one request at a time is
too slow or too error-prone.&lt;/p&gt;
&lt;h2 id="examples"&gt;Examples&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish bulk init api.rest.sh/books
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish bulk status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish bulk pull
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish bulk diff
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish bulk push
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish bulk reset
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;init&lt;/code&gt; starts a bulk workspace for a collection. &lt;code&gt;status&lt;/code&gt; shows local and remote
state. &lt;code&gt;pull&lt;/code&gt; refreshes local data. &lt;code&gt;diff&lt;/code&gt; previews local edits. &lt;code&gt;push&lt;/code&gt; sends
local changes only when it has a safe precondition such as an ETag,
Last-Modified value, or matching local/remote version metadata. &lt;code&gt;reset&lt;/code&gt; returns
the workspace to a clean state.&lt;/p&gt;</description></item><item><title>Command Plugins</title><link>https://rest.sh/docs/plugins/command-plugins/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/plugins/command-plugins/</guid><description>&lt;p&gt;Command plugins add root commands such as &lt;code&gt;bulk&lt;/code&gt; and &lt;code&gt;mcp&lt;/code&gt;. They can perform
multi-step workflows while delegating HTTP, config, prompts, and output back to
Restish.&lt;/p&gt;
&lt;h2 id="when-to-use-one"&gt;When To Use One&lt;/h2&gt;
&lt;p&gt;Use a command plugin when a feature needs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a top-level command&lt;/li&gt;
&lt;li&gt;multiple HTTP requests&lt;/li&gt;
&lt;li&gt;progress messages&lt;/li&gt;
&lt;li&gt;prompts or confirmations&lt;/li&gt;
&lt;li&gt;access to registered APIs and profiles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use a hook plugin for one request/response/auth/formatting task.&lt;/p&gt;
&lt;h2 id="delegated-http"&gt;Delegated HTTP&lt;/h2&gt;
&lt;p&gt;Go command plugins should use &lt;code&gt;plugin.CommandClient&lt;/code&gt; helpers instead of
hand-writing CBOR messages. Delegated HTTP uses &lt;code&gt;Do&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Connect to an API</title><link>https://rest.sh/docs/getting-started/connect-to-an-api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/getting-started/connect-to-an-api/</guid><description>&lt;p&gt;Use generic URL requests for exploration. Register an API when you want named
commands, generated help, shell completion, profiles, and auth tied to a stable
short name.&lt;/p&gt;
&lt;h2 id="register-the-example-api"&gt;Register The Example API&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api connect example api.rest.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restish discovers &lt;code&gt;https://api.rest.sh/openapi.json&lt;/code&gt;, stores the API config,
and caches the spec so generated commands are available quickly.&lt;/p&gt;
&lt;p&gt;The API name becomes a command group. Use a name that starts with a Unicode
letter or number and then uses only letters, numbers, combining marks, &lt;code&gt;-&lt;/code&gt;, or
&lt;code&gt;_&lt;/code&gt;. Names cannot collide with built-in commands such as &lt;code&gt;api&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;, or
&lt;code&gt;post&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Edit Command</title><link>https://rest.sh/docs/reference/edit-command/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/edit-command/</guid><description>&lt;p&gt;&lt;code&gt;edit&lt;/code&gt; is for APIs where a resource is easier to review in an editor than to
rebuild from command-line arguments. Restish fetches the resource, opens it in
your editor, then sends the changed document back with the appropriate update
request.&lt;/p&gt;
&lt;h2 id="generated-command-reference"&gt;Generated Command Reference&lt;/h2&gt;
&lt;!-- BEGIN GENERATED: restish-docgen edit-command --&gt;
&lt;p&gt;Generated from the current Cobra command tree.&lt;/p&gt;
&lt;h3 id="restish-edit"&gt;&lt;code&gt;restish edit&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Fetch a resource, edit it locally, then send it back&lt;/p&gt;
&lt;p&gt;Fetch a resource, edit it locally, then send the changed representation back.&lt;/p&gt;</description></item><item><title>Output</title><link>https://rest.sh/docs/guides/output/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/output/</guid><description>&lt;p&gt;Restish output is built around one rule: stdout carries the selected HTTP
exchange parts, while stderr carries diagnostics, warnings, progress, and
verbose traces.&lt;/p&gt;
&lt;h2 id="processing-model"&gt;Processing Model&lt;/h2&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 A[HTTP response] --&amp;gt; B[Decompress]
 B --&amp;gt; C[Decode by Content-Type]
 C --&amp;gt; D[Normalize status, headers, links, body]
 D --&amp;gt; E[Paginate or stream]
 E --&amp;gt; F[Filter]
 F --&amp;gt; G[Format]&lt;/pre&gt;
&lt;h2 id="choose-a-format"&gt;Choose A Format&lt;/h2&gt;
&lt;div class="restish-playground" data-restish-playground&gt;
 &lt;div class="restish-playground__bar"&gt;
 &lt;div&gt;
 &lt;span class="restish-playground__eyebrow"&gt;Browser preview&lt;/span&gt;
 &lt;p class="restish-playground__hint"&gt;Edit the command and run it from your browser against the live docs API.&lt;/p&gt;</description></item><item><title>Plugin Command</title><link>https://rest.sh/docs/reference/plugin-command/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/plugin-command/</guid><description>&lt;p&gt;Plugins extend Restish without making every feature part of the core binary.
Operators use the &lt;code&gt;plugin&lt;/code&gt; command to install, list, remove, and debug those
extensions. Authors use the plugin reference pages to understand the protocols.&lt;/p&gt;
&lt;p&gt;Installed plugins are executable code and run at your own risk. Restish checks
manifests and declared capabilities; it does not sandbox plugins or verify
publisher identity.&lt;/p&gt;
&lt;h2 id="generated-command-reference"&gt;Generated Command Reference&lt;/h2&gt;
&lt;!-- BEGIN GENERATED: restish-docgen plugin-command --&gt;
&lt;p&gt;Generated from the current Cobra command tree.&lt;/p&gt;</description></item><item><title>Release Packaging</title><link>https://rest.sh/docs/contributing/release-packaging/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/contributing/release-packaging/</guid><description>&lt;p&gt;Use this page when preparing a Restish v2 release. It keeps the release
artifacts, package-manager metadata, plugin binaries, and docs in the same
checklist.&lt;/p&gt;
&lt;p&gt;The public install guide assumes the v2 release artifacts are available:
Homebrew first for macOS users, then source, mise, GitHub archives, and OCI
image options. Before publishing docs, verify each public artifact below rather
than adding temporary caveats to the user-facing install path.&lt;/p&gt;
&lt;h2 id="version-and-changelog"&gt;Version And Changelog&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Update the build version used by release builds.&lt;/li&gt;
&lt;li&gt;Update the changelog with user-visible features, breaking changes, migration
notes, and plugin protocol changes.&lt;/li&gt;
&lt;li&gt;Check the upgrade guide when a v1 behavior changed or a v2 draft command was
removed before release.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="github-releases"&gt;GitHub Releases&lt;/h2&gt;
&lt;p&gt;Release archives should include the &lt;code&gt;restish&lt;/code&gt; binary for supported macOS,
Linux, and Windows targets on &lt;code&gt;amd64&lt;/code&gt; and &lt;code&gt;arm64&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Save a Response Unchanged</title><link>https://rest.sh/docs/recipes/save-a-response-unchanged/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/recipes/save-a-response-unchanged/</guid><description>&lt;p&gt;When stdout is redirected and you do not choose a filter, collection, metadata
shortcut, or output format, Restish writes the response body bytes. That matters
for binary files, structured fixtures such as CBOR, and anything another
program will parse directly. Response middleware plugins are skipped for this
raw-download path, so installed plugins cannot silently alter saved files.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/bytes/64 &amp;gt; sample.bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/formats/cbor &amp;gt; response.cbor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For an image:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/images/jpeg &amp;gt; dragonfly.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Use &lt;code&gt;-o json&lt;/code&gt;, &lt;code&gt;-o yaml&lt;/code&gt;, or another output format when you want Restish to
transform the decoded body or apply response middleware before rendering.
Redirected byte output still uses the body that Go&amp;rsquo;s HTTP client exposes after
any HTTP content-encoding decompression; it is not a packet capture of the exact
wire transfer. The distinction is part of Restish&amp;rsquo;s
&lt;a href="https://rest.sh/docs/reference/output-defaults/"&gt;output defaults&lt;/a&gt;.
Restish&amp;rsquo;s default &lt;code&gt;Accept&lt;/code&gt; header still prefers JSON and other text-friendly
structured formats; set &lt;code&gt;Accept&lt;/code&gt; yourself when you want the server to send a
binary structured format such as CBOR.&lt;/p&gt;</description></item><item><title>Upgrade From v1</title><link>https://rest.sh/docs/getting-started/upgrade-from-v1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/getting-started/upgrade-from-v1/</guid><description>&lt;p&gt;This page is the shortest path for existing Restish v1 users who want to know
what changed, what is preserved automatically, and what needs a manual update.
The archived v1 documentation remains available at &lt;a href="https://rest.sh/v1/"&gt;rest.sh/v1/&lt;/a&gt; for
old links, internal runbooks, and side-by-side migration checks.&lt;/p&gt;
&lt;h2 id="what-to-expect"&gt;What To Expect&lt;/h2&gt;
&lt;p&gt;Restish v2 keeps the same basic idea: start with generic HTTP requests, then
register APIs for generated commands, profiles, auth, filtering, pagination,
and plugins.&lt;/p&gt;</description></item><item><title>Download a File With Headers Preserved</title><link>https://rest.sh/docs/recipes/download-a-file-with-headers-preserved/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/recipes/download-a-file-with-headers-preserved/</guid><description>&lt;p&gt;When you save a response to a file, stdout should contain only the body bytes.
Verbose diagnostics are written to stderr, so you can redirect them to a
separate file without corrupting the download.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish -v api.rest.sh/images/jpeg &amp;gt; dragonfly.jpg 2&amp;gt; dragonfly.headers.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The body goes to stdout and verbose metadata goes to stderr, so the saved file
stays clean. Unfiltered responses redirect as body bytes by default; see
&lt;a href="https://rest.sh/docs/reference/output-defaults/"&gt;Output Defaults&lt;/a&gt; for how redirects choose
between body bytes and formatted values.&lt;/p&gt;</description></item><item><title>Force JSON Output to a File</title><link>https://rest.sh/docs/recipes/force-json-output-to-a-file/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/recipes/force-json-output-to-a-file/</guid><description>&lt;p&gt;Redirected output saves response body bytes by default. Choose &lt;code&gt;-o json&lt;/code&gt; when a
script needs Restish to render decoded structured data as one JSON document.
&lt;code&gt;--rsh-collect&lt;/code&gt; matters when pagination is involved: it asks Restish to build
one logical document before writing the file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/images --rsh-collect -o json &amp;gt; images.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The file is pretty-printed by default. Add &lt;code&gt;--rsh-print=b&lt;/code&gt; when compact JSON is
more useful:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api.rest.sh/images --rsh-collect -o json --rsh-print&lt;span class="o"&gt;=&lt;/span&gt;b &amp;gt; images.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Open the file with &lt;code&gt;jq&lt;/code&gt;, an editor, or another tool that expects one complete
JSON value. For line-oriented pipelines, prefer &lt;code&gt;-o ndjson&lt;/code&gt; instead; the
&lt;a href="https://rest.sh/docs/guides/output/"&gt;Output guide&lt;/a&gt; explains document versus record formats.&lt;/p&gt;</description></item><item><title>Filtering</title><link>https://rest.sh/docs/guides/filtering/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/filtering/</guid><description>&lt;p&gt;Filtering trims a normalized Restish response before formatting. Use shorthand
for direct paths and projections; use jq for richer transforms.&lt;/p&gt;
&lt;h2 id="filter-roots"&gt;Filter Roots&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;proto&lt;/code&gt; for the response protocol string&lt;/li&gt;
&lt;li&gt;&lt;code&gt;status&lt;/code&gt; for the numeric HTTP status&lt;/li&gt;
&lt;li&gt;&lt;code&gt;headers&lt;/code&gt; for response headers&lt;/li&gt;
&lt;li&gt;&lt;code&gt;links&lt;/code&gt; for normalized hypermedia links&lt;/li&gt;
&lt;li&gt;&lt;code&gt;body&lt;/code&gt; for decoded response body&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="restish-playground" data-restish-playground&gt;
 &lt;div class="restish-playground__bar"&gt;
 &lt;div&gt;
 &lt;span class="restish-playground__eyebrow"&gt;Browser preview&lt;/span&gt;
 &lt;p class="restish-playground__hint"&gt;Edit the command and run it from your browser against the live docs API.&lt;/p&gt;
 &lt;/div&gt;
 &lt;div class="restish-playground__actions"&gt;
 &lt;span class="restish-playground__state" data-restish-state&gt;Ready&lt;/span&gt;
 &lt;button class="restish-playground__button" type="button" data-restish-run aria-controls="restish-example-0-output"&gt;
 &lt;i class="fas fa-play" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;span&gt;Run&lt;/span&gt;
 &lt;/button&gt;
 &lt;button class="restish-playground__icon-button" type="button" data-restish-copy title="Copy command" aria-label="Copy command"&gt;
 &lt;i class="fas fa-copy" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;/button&gt;
 &lt;button class="restish-playground__icon-button" type="button" data-restish-reset title="Reset command" aria-label="Reset command"&gt;
 &lt;i class="fas fa-rotate-left" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;/button&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;label class="visually-hidden" for="restish-example-0-command"&gt;Restish command&lt;/label&gt;
 &lt;div class="restish-playground__terminal-line"&gt;
 &lt;span class="restish-playground__prompt" aria-hidden="true"&gt;$&lt;/span&gt;
 &lt;div class="restish-playground__command-wrap"&gt;
 &lt;div class="restish-playground__command-highlight" aria-hidden="true"&gt;&lt;code class="language-bash" data-restish-command-highlight&gt;restish api.rest.sh/ -f headers.Content-Type&lt;/code&gt;&lt;/div&gt;
 &lt;input id="restish-example-0-command" class="restish-playground__command" type="text" spellcheck="false" autocomplete="off" autocapitalize="off" value="restish api.rest.sh/ -f headers.Content-Type" data-restish-command&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;pre id="restish-example-0-output" class="restish-playground__output" aria-live="polite" hidden&gt;&lt;code class="language-readable" data-restish-output&gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;noscript&gt;
 &lt;p class="restish-playground__noscript"&gt;Enable JavaScript to run this example in the browser.&lt;/p&gt;</description></item><item><title>Set Up Profiles</title><link>https://rest.sh/docs/getting-started/set-up-profiles/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/getting-started/set-up-profiles/</guid><description>&lt;p&gt;Profiles are named request defaults under an API. Use them when a command should
stay readable even though the target environment, auth, headers, query params,
or TLS settings change.&lt;/p&gt;
&lt;h2 id="start-with-one-api"&gt;Start With One API&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api connect example api.rest.sh &lt;span class="s1"&gt;&amp;#39;prompt.api_key: docs-key&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add profiles under the API with &lt;code&gt;api set&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api &lt;span class="nb"&gt;set&lt;/span&gt; example &lt;span class="s1"&gt;&amp;#39;profiles.json.headers[]: &amp;#34;Accept: application/json&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api &lt;span class="nb"&gt;set&lt;/span&gt; example &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;profiles.debug: {headers: [&amp;#34;Accept: application/json&amp;#34;, &amp;#34;X-Debug: true&amp;#34;], query: [&amp;#34;trace=docs&amp;#34;]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api &lt;span class="nb"&gt;set&lt;/span&gt; example &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;profiles.token.auth: {type: bearer, params: {token: env:RESTISH_DOCS_TOKEN}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Those commands write profile entries like this:&lt;/p&gt;</description></item><item><title>Pagination and Links</title><link>https://rest.sh/docs/guides/pagination/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/pagination/</guid><description>&lt;p&gt;Restish follows recognized &lt;code&gt;next&lt;/code&gt; links for collection responses by default.
Use limits and collect mode to make the behavior explicit.&lt;/p&gt;
&lt;h2 id="automatic-pagination"&gt;Automatic Pagination&lt;/h2&gt;
&lt;div class="restish-playground" data-restish-playground&gt;
 &lt;div class="restish-playground__bar"&gt;
 &lt;div&gt;
 &lt;span class="restish-playground__eyebrow"&gt;Browser preview&lt;/span&gt;
 &lt;p class="restish-playground__hint"&gt;Edit the command and run it from your browser against the live docs API.&lt;/p&gt;
 &lt;/div&gt;
 &lt;div class="restish-playground__actions"&gt;
 &lt;span class="restish-playground__state" data-restish-state&gt;Ready&lt;/span&gt;
 &lt;button class="restish-playground__button" type="button" data-restish-run aria-controls="restish-example-0-output"&gt;
 &lt;i class="fas fa-play" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;span&gt;Run&lt;/span&gt;
 &lt;/button&gt;
 &lt;button class="restish-playground__icon-button" type="button" data-restish-copy title="Copy command" aria-label="Copy command"&gt;
 &lt;i class="fas fa-copy" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;/button&gt;
 &lt;button class="restish-playground__icon-button" type="button" data-restish-reset title="Reset command" aria-label="Reset command"&gt;
 &lt;i class="fas fa-rotate-left" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;/button&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;label class="visually-hidden" for="restish-example-0-command"&gt;Restish command&lt;/label&gt;
 &lt;div class="restish-playground__terminal-line"&gt;
 &lt;span class="restish-playground__prompt" aria-hidden="true"&gt;$&lt;/span&gt;
 &lt;div class="restish-playground__command-wrap"&gt;
 &lt;div class="restish-playground__command-highlight" aria-hidden="true"&gt;&lt;code class="language-bash" data-restish-command-highlight&gt;restish api.rest.sh/images -f body.self -o lines&lt;/code&gt;&lt;/div&gt;
 &lt;input id="restish-example-0-command" class="restish-playground__command" type="text" spellcheck="false" autocomplete="off" autocapitalize="off" value="restish api.rest.sh/images -f body.self -o lines" data-restish-command&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;pre id="restish-example-0-output" class="restish-playground__output" aria-live="polite" hidden&gt;&lt;code class="language-readable" data-restish-output&gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;noscript&gt;
 &lt;p class="restish-playground__noscript"&gt;Enable JavaScript to run this example in the browser.&lt;/p&gt;</description></item><item><title>TLS Signer Plugins</title><link>https://rest.sh/docs/plugins/tls-signer-plugins/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/plugins/tls-signer-plugins/</guid><description>&lt;p&gt;TLS signer plugins are for mTLS environments where the client private key lives
in hardware, a secure service, or another process.&lt;/p&gt;
&lt;h2 id="operator-example"&gt;Operator Example&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --rsh-tls-signer pkcs11 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --rsh-tls-signer-param &lt;span class="nv"&gt;module&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/lib/opensc-pkcs11.so &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://mtls.internal.test/items
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Prerequisites: the signer plugin is installed, the signer can access the client
certificate and signing key material it needs, and the target API requires
mTLS.&lt;/p&gt;
&lt;h2 id="profile-shape"&gt;Profile Shape&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsonc" data-lang="jsonc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;apis&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;secure&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;base_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://mtls.internal.test&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;profiles&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;ca_cert&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/etc/ssl/internal-ca.pem&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tls_signer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pkcs11&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tls_signer_params&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;module&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/usr/local/lib/opensc-pkcs11.so&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;token_label&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Restish&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;pin_env&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PKCS11_PIN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Profile-level TLS settings override API-level defaults for that profile. Use
either &lt;code&gt;client_cert&lt;/code&gt;/&lt;code&gt;client_key&lt;/code&gt; files or &lt;code&gt;tls_signer&lt;/code&gt; for one request; Restish
rejects configs that combine both client-certificate files and a TLS signer.&lt;/p&gt;</description></item><item><title>Count Items Across All Pages</title><link>https://rest.sh/docs/recipes/count-items-across-all-pages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/recipes/count-items-across-all-pages/</guid><description>&lt;p&gt;Counting is a whole-collection operation. If Restish streams paginated items as
they arrive, a filter can start earlier but it does not necessarily see the
entire logical result at once. &lt;code&gt;--rsh-collect&lt;/code&gt; tells Restish to gather the
paginated response before applying the filter.&lt;/p&gt;
&lt;div class="restish-playground" data-restish-playground&gt;
 &lt;div class="restish-playground__bar"&gt;
 &lt;div&gt;
 &lt;span class="restish-playground__eyebrow"&gt;Browser preview&lt;/span&gt;
 &lt;p class="restish-playground__hint"&gt;Edit the command and run it from your browser against the live docs API.&lt;/p&gt;
 &lt;/div&gt;
 &lt;div class="restish-playground__actions"&gt;
 &lt;span class="restish-playground__state" data-restish-state&gt;Ready&lt;/span&gt;
 &lt;button class="restish-playground__button" type="button" data-restish-run aria-controls="restish-example-0-output"&gt;
 &lt;i class="fas fa-play" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;span&gt;Run&lt;/span&gt;
 &lt;/button&gt;
 &lt;button class="restish-playground__icon-button" type="button" data-restish-copy title="Copy command" aria-label="Copy command"&gt;
 &lt;i class="fas fa-copy" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;/button&gt;
 &lt;button class="restish-playground__icon-button" type="button" data-restish-reset title="Reset command" aria-label="Reset command"&gt;
 &lt;i class="fas fa-rotate-left" aria-hidden="true"&gt;&lt;/i&gt;
 &lt;/button&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;label class="visually-hidden" for="restish-example-0-command"&gt;Restish command&lt;/label&gt;
 &lt;div class="restish-playground__terminal-line"&gt;
 &lt;span class="restish-playground__prompt" aria-hidden="true"&gt;$&lt;/span&gt;
 &lt;div class="restish-playground__command-wrap"&gt;
 &lt;div class="restish-playground__command-highlight" aria-hidden="true"&gt;&lt;code class="language-bash" data-restish-command-highlight&gt;restish api.rest.sh/images --rsh-collect -f &amp;#39;.body | length&amp;#39;&lt;/code&gt;&lt;/div&gt;
 &lt;input id="restish-example-0-command" class="restish-playground__command" type="text" spellcheck="false" autocomplete="off" autocapitalize="off" value="restish api.rest.sh/images --rsh-collect -f &amp;#39;.body | length&amp;#39;" data-restish-command&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;pre id="restish-example-0-output" class="restish-playground__output" aria-live="polite" hidden&gt;&lt;code class="language-readable" data-restish-output&gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;noscript&gt;
 &lt;p class="restish-playground__noscript"&gt;Enable JavaScript to run this example in the browser.&lt;/p&gt;</description></item><item><title>Links and Hypermedia</title><link>https://rest.sh/docs/guides/links-and-hypermedia/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/links-and-hypermedia/</guid><description>&lt;p&gt;Restish normalizes hypermedia links so filters, pagination, and the &lt;code&gt;links&lt;/code&gt;
command can use one shape even when APIs expose links differently.&lt;/p&gt;
&lt;h2 id="recognized-link-sources"&gt;Recognized Link Sources&lt;/h2&gt;
&lt;p&gt;Restish can extract links from sources such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP &lt;code&gt;Link&lt;/code&gt; headers&lt;/li&gt;
&lt;li&gt;HAL-style &lt;code&gt;_links&lt;/code&gt;, including arrays of HAL resources&lt;/li&gt;
&lt;li&gt;JSON:API-style top-level &lt;code&gt;links&lt;/code&gt; and resource &lt;code&gt;links.self&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Siren links&lt;/li&gt;
&lt;li&gt;JSON-LD or TSJ &lt;code&gt;@id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;simple REST-ish &lt;code&gt;self&lt;/code&gt; fields on top-level objects or nested array items&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The exact source matters less to users than the normalized result: relation
names such as &lt;code&gt;self&lt;/code&gt;, &lt;code&gt;next&lt;/code&gt;, and &lt;code&gt;prev&lt;/code&gt; become queryable under &lt;code&gt;links&lt;/code&gt;.
Nested array item links use relation names based on the field, such as
&lt;code&gt;things-item&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Plugin Manifest</title><link>https://rest.sh/docs/reference/plugin-manifest/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/plugin-manifest/</guid><description>&lt;p&gt;A plugin manifest tells Restish what a plugin is, what protocol version it uses,
and which hooks or command surfaces it provides.&lt;/p&gt;
&lt;h2 id="generated-schema"&gt;Generated Schema&lt;/h2&gt;
&lt;!-- BEGIN GENERATED: restish-docgen plugin-manifest-schema --&gt;
&lt;p&gt;Generated from &lt;code&gt;plugin/manifest.go&lt;/code&gt; and &lt;code&gt;plugin/messages.go&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="manifest"&gt;&lt;code&gt;Manifest&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Manifest is the metadata a plugin reports when called with &amp;ndash;rsh-plugin-manifest. Plugin authors populate and write this with WriteManifest instead of manually marshalling CBOR.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Name&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CBOR: &lt;code&gt;name&lt;/code&gt;; JSON: &lt;code&gt;name&lt;/code&gt;; type: &lt;code&gt;string&lt;/code&gt;; required: yes&lt;/p&gt;
&lt;p&gt;Name is the stable plugin identifier, without the &amp;ldquo;restish-&amp;rdquo; executable prefix.&lt;/p&gt;</description></item><item><title>Plugin Messages</title><link>https://rest.sh/docs/reference/plugin-messages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/plugin-messages/</guid><description>&lt;p&gt;Restish v2 plugins communicate over structured messages. Operators usually need
&lt;code&gt;plugin debug&lt;/code&gt;; authors need the message families and lifecycle rules.&lt;/p&gt;
&lt;p&gt;All startup and runtime messages are CBOR data items on stdin/stdout. CBOR is
self-delimiting, so there is no length prefix or line framing. Startup discovery
writes a single message and exits. Command plugins and TLS signer plugins keep
one decoder open for the process lifetime because later messages can already be
buffered.&lt;/p&gt;</description></item><item><title>Edit Workflow</title><link>https://rest.sh/docs/guides/edit-workflow/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/edit-workflow/</guid><description>&lt;p&gt;&lt;code&gt;restish edit&lt;/code&gt; is for fetch-edit-update workflows. It gets the resource,
opens an editor or applies shorthand changes, then writes the result back.&lt;/p&gt;
&lt;h2 id="edit-in-your-editor"&gt;Edit In Your Editor&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish edit api.rest.sh/types
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restish uses &lt;code&gt;$VISUAL&lt;/code&gt;, then &lt;code&gt;$EDITOR&lt;/code&gt;, and falls back to the platform default
where possible.&lt;/p&gt;
&lt;p&gt;After the editor exits, Restish parses the file and compares the normalized
resource value. If the editor only changed whitespace, indentation, key spacing,
or trailing newlines, Restish reports no changes and does not send an update.&lt;/p&gt;</description></item><item><title>Use External-Tool Auth</title><link>https://rest.sh/docs/recipes/use-external-tool-auth/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/recipes/use-external-tool-auth/</guid><description>&lt;p&gt;External-tool auth is for organizations that already have a credential helper,
request signer, SSO command, or token refresh program. Restish asks the helper
to prepare auth for the request instead of trying to own those credentials
itself.&lt;/p&gt;
&lt;p&gt;Config shape:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsonc" data-lang="jsonc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;apis&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;vendor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;base_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://api.vendor.test&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;profiles&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;auth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;external-tool&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;params&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;commandline&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./scripts/sign-request&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restish approves external tools by command hash. If the helper changes, you
must approve it again.&lt;/p&gt;</description></item><item><title>Use a Custom CA</title><link>https://rest.sh/docs/recipes/use-a-custom-ca/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/recipes/use-a-custom-ca/</guid><description>&lt;p&gt;Private services often use certificates signed by an internal certificate
authority. Restish uses the normal system trust store by default; add
&lt;code&gt;--rsh-ca-cert&lt;/code&gt; when one request should also trust your organization&amp;rsquo;s CA file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish --rsh-ca-cert ./corp-ca.pem https://service.internal.test/items
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Prerequisite: &lt;code&gt;corp-ca.pem&lt;/code&gt; is the PEM-encoded CA certificate that signed the
server certificate. Replace &lt;code&gt;service.internal.test&lt;/code&gt; with the internal host you
need to reach.&lt;/p&gt;
&lt;p&gt;Inspect the chain first:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish cert --rsh-ca-cert ./corp-ca.pem https://service.internal.test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;cert&lt;/code&gt; command helps confirm that the server presents the certificate chain
you expect before you debug application-level behavior. For repeated internal
requests, store TLS settings in a profile as described in &lt;a href="https://rest.sh/docs/guides/tls/"&gt;TLS&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Use mTLS With a TLS Signer</title><link>https://rest.sh/docs/recipes/use-mtls-with-a-tls-signer/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/recipes/use-mtls-with-a-tls-signer/</guid><description>&lt;p&gt;mTLS proves the client identity during the TLS handshake. A TLS signer plugin is
useful when the private key lives in hardware, an OS keychain, or another system
that should not hand raw key material to Restish.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --rsh-tls-signer pkcs11 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --rsh-tls-signer-param &lt;span class="nv"&gt;module&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/lib/opensc-pkcs11.so &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://mtls.internal.test/items
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Prerequisites: a configured signer plugin that can access the client
certificate and signing key material, and an API that requires mTLS. Replace
&lt;code&gt;mtls.internal.test&lt;/code&gt; and signer parameters with your environment&amp;rsquo;s values.&lt;/p&gt;</description></item><item><title>Retries and Caching</title><link>https://rest.sh/docs/guides/retries-and-caching/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/retries-and-caching/</guid><description>&lt;p&gt;Restish retries conservative transient failures and uses a disk-backed HTTP
cache for cacheable responses.&lt;/p&gt;
&lt;h2 id="retry-behavior"&gt;Retry Behavior&lt;/h2&gt;
&lt;p&gt;Restish retries network errors plus &lt;code&gt;408&lt;/code&gt;, &lt;code&gt;429&lt;/code&gt;, &lt;code&gt;500&lt;/code&gt;, &lt;code&gt;502&lt;/code&gt;, &lt;code&gt;503&lt;/code&gt;, and
&lt;code&gt;504&lt;/code&gt; responses by default. Automatic retries are limited to &lt;code&gt;GET&lt;/code&gt; and &lt;code&gt;HEAD&lt;/code&gt;,
where retrying is normally safe. &lt;code&gt;--rsh-retry N&lt;/code&gt; controls the attempt count;
use &lt;code&gt;--rsh-retry-unsafe&lt;/code&gt; only when you want to retry POST, PUT, PATCH, or
DELETE, because that can repeat side effects if the server processed the first
attempt. Restish honors &lt;code&gt;Retry-After&lt;/code&gt; and &lt;code&gt;X-Retry-In&lt;/code&gt; when present, capped at
5 minutes by default. Use
&lt;code&gt;--rsh-retry-max-wait 30s&lt;/code&gt; for one command, or set an API-level
&lt;code&gt;retry_max_wait&lt;/code&gt; duration in &lt;code&gt;restish.json&lt;/code&gt;, when a service needs a shorter
rate-limit wait.&lt;/p&gt;</description></item><item><title>Command Behavior</title><link>https://rest.sh/docs/guides/command-behavior/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/command-behavior/</guid><description>&lt;p&gt;Restish is designed for terminals and scripts. Output channels, exit codes, and
verbose diagnostics are part of the interface.&lt;/p&gt;
&lt;h2 id="exit-codes"&gt;Exit Codes&lt;/h2&gt;
&lt;p&gt;Restish uses a compact exit-code policy:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Result&lt;/th&gt;
 &lt;th&gt;Exit code&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Successful command, including final HTTP &lt;code&gt;2xx&lt;/code&gt; responses&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Redirects are followed before the final status is evaluated.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Final HTTP &lt;code&gt;3xx&lt;/code&gt; response&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Redirects are followed before the final status is evaluated.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Final HTTP &lt;code&gt;4xx&lt;/code&gt; response&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Restish still writes the response body before exiting non-zero.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Final HTTP &lt;code&gt;5xx&lt;/code&gt; response&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Restish still writes the response body before exiting non-zero.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Runtime failure&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Network errors, TLS failures, config problems, auth failures, parse errors, formatter errors, and most plugin failures.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Usage error&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Missing arguments, unknown commands, unknown flags, or invalid flag values before the request runs.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Interrupted with &lt;code&gt;Ctrl-C&lt;/code&gt; / SIGINT&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;130&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Matches the usual shell convention for interrupted processes.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Command plugin exit code&lt;/td&gt;
 &lt;td&gt;plugin-defined&lt;/td&gt;
 &lt;td&gt;Command plugins may return their own &lt;code&gt;0&lt;/code&gt;-&lt;code&gt;255&lt;/code&gt; exit code.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Inspect an error body without failing the shell command:&lt;/p&gt;</description></item><item><title>Scripting and Automation</title><link>https://rest.sh/docs/guides/automation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/automation/</guid><description>&lt;p&gt;Restish is scriptable when response data stays on stdout, diagnostics stay on
stderr, and long-running work is bounded. Use this guide for CI, cron jobs,
shell loops, and small automation around APIs.&lt;/p&gt;
&lt;h2 id="output-streams"&gt;Output Streams&lt;/h2&gt;
&lt;p&gt;Selected output is written to stdout. Progress, verbose request/response
details, plugin diagnostics, migration notices, and warnings are written to
stderr. Redirecting or piping stdout changes &lt;code&gt;--rsh-print=auto&lt;/code&gt; from an
interactive response transcript to raw body bytes for unfiltered responses, or
to pretty rendered output when a filter, metadata shortcut, collection, or
explicit output format is selected.&lt;/p&gt;</description></item><item><title>Streaming</title><link>https://rest.sh/docs/guides/streaming/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/streaming/</guid><description>&lt;p&gt;Restish recognizes Server-Sent Events, NDJSON, and JSON Lines. Streaming
responses are processed one event or line at a time instead of waiting for a
complete response body.&lt;/p&gt;
&lt;p&gt;Streams run until EOF, interruption, or an explicit stream limit. Add
&lt;code&gt;--rsh-max-items&lt;/code&gt; when you want a sample or a script with a fixed record count.
For streams, &lt;code&gt;--rsh-timeout&lt;/code&gt; bounds the wait for response headers; once headers
identify SSE or NDJSON, the body can stay open until EOF, Ctrl-C, or
&lt;code&gt;--rsh-max-items&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>TLS</title><link>https://rest.sh/docs/guides/tls/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/tls/</guid><description>&lt;p&gt;Restish verifies TLS certificates by default. Custom CA and mTLS examples
require your own certificate infrastructure, so this page uses private hostnames
for those parts.&lt;/p&gt;
&lt;h2 id="inspect-a-server-certificate"&gt;Inspect A Server Certificate&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish cert api.rest.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish cert --warn-days &lt;span class="m"&gt;14&lt;/span&gt; api.rest.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;cert&lt;/code&gt; is TLS-only. Bare hosts default to &lt;code&gt;https://&lt;/code&gt;; &lt;code&gt;http://&lt;/code&gt; targets are
rejected before any network connection.&lt;/p&gt;
&lt;h2 id="trust-a-custom-ca"&gt;Trust A Custom CA&lt;/h2&gt;
&lt;p&gt;Use this when your organization uses a private CA:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish --rsh-ca-cert ./corp-ca.pem https://service.internal.test/items
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish cert --rsh-ca-cert ./corp-ca.pem https://service.internal.test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Prerequisite: &lt;code&gt;corp-ca.pem&lt;/code&gt; must contain the PEM-encoded CA certificate that
signed the server certificate.
If the platform trust store cannot be loaded, Restish fails closed instead of
continuing with only the custom CA file.&lt;/p&gt;</description></item><item><title>Bulk Management</title><link>https://rest.sh/docs/plugins/bulk-management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/plugins/bulk-management/</guid><description>&lt;p&gt;&lt;code&gt;restish bulk&lt;/code&gt; is a command-plugin workflow for checking out many API resources
to disk, editing them locally, and pushing changes back through Restish.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;restish-bulk&lt;/code&gt; plugin binary is installed and discoverable.&lt;/li&gt;
&lt;li&gt;The target API exposes collection and item URLs.&lt;/li&gt;
&lt;li&gt;You understand the API&amp;rsquo;s update semantics before pushing changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Verify discovery:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish plugin list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish bulk --help
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="initialize-a-checkout"&gt;Initialize A Checkout&lt;/h2&gt;
&lt;p&gt;The example API has a books collection used for bulk examples:&lt;/p&gt;</description></item><item><title>Serve APIs Over MCP</title><link>https://rest.sh/docs/plugins/mcp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/plugins/mcp/</guid><description>&lt;p&gt;&lt;code&gt;restish-mcp&lt;/code&gt; is a command plugin that exposes registered OpenAPI operations as
MCP tools. Use it when an MCP client should call APIs through Restish profiles,
auth, TLS, retries, and output normalization.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish api connect example api.rest.sh &lt;span class="s1"&gt;&amp;#39;prompt.api_key: docs-key&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish plugin list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The API must be registered and have a usable spec.&lt;/p&gt;
&lt;h2 id="serve-tools"&gt;Serve Tools&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restish mcp serve example
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The plugin reads the registered API spec, turns operations into MCP tools, and
delegates HTTP execution back to Restish.&lt;/p&gt;</description></item><item><title>Troubleshooting</title><link>https://rest.sh/docs/guides/troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/guides/troubleshooting/</guid><description>&lt;p&gt;Use this page when the command ran but the result was surprising, or when the
command did not run because shell, config, auth, TLS, or plugin setup got in the
way.&lt;/p&gt;
&lt;h2 id="the-shell-rewrites-my-url-or-filter"&gt;The Shell Rewrites My URL Or Filter&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; A command with &lt;code&gt;?&lt;/code&gt;, &lt;code&gt;&amp;amp;&lt;/code&gt;, &lt;code&gt;[0]&lt;/code&gt;, &lt;code&gt;[]&lt;/code&gt;, or &lt;code&gt;*&lt;/code&gt; fails before Restish
sends a request.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Likely cause:&lt;/strong&gt; Your shell expanded the characters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to confirm:&lt;/strong&gt; Quote the URL or filter and retry.&lt;/p&gt;</description></item><item><title>Embedding Restish in Go</title><link>https://rest.sh/docs/reference/embedding/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rest.sh/docs/reference/embedding/</guid><description>&lt;p&gt;Restish can be used as a Go library when an organization wants to ship a
branded CLI while keeping Restish&amp;rsquo;s request pipeline, OpenAPI command
generation, auth, output, and plugin behavior.&lt;/p&gt;
&lt;p&gt;Use out-of-process plugins for the stock &lt;code&gt;restish&lt;/code&gt; binary. Use embedding when
you own the binary and need in-process defaults or extensions.&lt;/p&gt;
&lt;h2 id="minimal-custom-cli"&gt;Minimal Custom CLI&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;os&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;restish&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;github.com/rest-sh/restish/v2&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;cli&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;restish&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;New&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cli&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;cli&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HandleError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Run&lt;/code&gt; installs SIGINT/SIGTERM handling by default so Ctrl-C cancels in-flight
requests in the stock CLI. If your application already owns process signal
handling, disable Restish&amp;rsquo;s handler before running:&lt;/p&gt;</description></item></channel></rss>