From 1b8e7485da8fc91e940d52a6cb88874add664af1 Mon Sep 17 00:00:00 2001 From: contra Date: Wed, 12 Aug 2026 17:16:56 +0300 Subject: [PATCH 01/11] fix: update package and GoReleaser descriptions to approved positioning Description: A proxied shell for terminal workflows. Open a session, connect a route, and run commands normally. Added npm keywords: automation, cli, command-line-tool, developer-tools, geo-testing, http-proxy, network-debugging, proxy, shell, terminal. Signed-off-by: contra --- .goreleaser.yaml | 2 +- npm/shellroute/package.json | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 384e177..fcc5bef 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -67,7 +67,7 @@ brews: name: homebrew-tap token: "{{ .Env.HOMEBREW_TAP_GITHUB_TOKEN }}" homepage: "https://shellroute.com" - description: "Residential proxy CLI" + description: "A proxied shell for terminal workflows. Open a session, connect a route, and run commands normally." directory: Formula signs: diff --git a/npm/shellroute/package.json b/npm/shellroute/package.json index f86b307..6ef7612 100644 --- a/npm/shellroute/package.json +++ b/npm/shellroute/package.json @@ -1,7 +1,7 @@ { "name": "shellroute", "version": "0.1.0", - "description": "Residential proxy CLI", + "description": "A proxied shell for terminal workflows. Open a session, connect a route, and run commands normally.", "license": "Apache-2.0", "repository": { "type": "git", @@ -21,5 +21,17 @@ "@shellroute/cli-darwin-x64": "0.1.0", "@shellroute/cli-linux-arm64": "0.1.0", "@shellroute/cli-linux-x64": "0.1.0" - } + }, + "keywords": [ + "automation", + "cli", + "command-line-tool", + "developer-tools", + "geo-testing", + "http-proxy", + "network-debugging", + "proxy", + "shell", + "terminal" + ] } From 8934491c13113b67de68a31507cdee01388d237e Mon Sep 17 00:00:00 2001 From: contra Date: Wed, 12 Aug 2026 17:34:42 +0300 Subject: [PATCH 02/11] chore: gitignore agent instruction files --- .gitignore | 4 ++++ .goreleaser.yaml | 2 +- npm/shellroute/package.json | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 895b2e9..208e49f 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,7 @@ npm/cli-*/bin/ # Local release artifacts *.tar.gz *.zip + +# Agent instructions +AGENTS.md +CLAUDE.md diff --git a/.goreleaser.yaml b/.goreleaser.yaml index fcc5bef..a8408e6 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -67,7 +67,7 @@ brews: name: homebrew-tap token: "{{ .Env.HOMEBREW_TAP_GITHUB_TOKEN }}" homepage: "https://shellroute.com" - description: "A proxied shell for terminal workflows. Open a session, connect a route, and run commands normally." + description: "A proxied shell for terminal workflows. Open a session, choose a proxy, and run commands normally." directory: Formula signs: diff --git a/npm/shellroute/package.json b/npm/shellroute/package.json index 6ef7612..89ca401 100644 --- a/npm/shellroute/package.json +++ b/npm/shellroute/package.json @@ -1,7 +1,7 @@ { "name": "shellroute", "version": "0.1.0", - "description": "A proxied shell for terminal workflows. Open a session, connect a route, and run commands normally.", + "description": "A proxied shell for terminal workflows. Open a session, choose a proxy, and run commands normally.", "license": "Apache-2.0", "repository": { "type": "git", From f5ea975170a0d07c6c3daeda1699dff710d2dd69 Mon Sep 17 00:00:00 2001 From: contra Date: Thu, 13 Aug 2026 12:37:06 +0300 Subject: [PATCH 03/11] docs: update README copy and quickstart (MKT-003) - Opening: "Every terminal can be somewhere else" - Quickstart: show interactive mode + direct mode - How it works: simplified, link to compatibility matrix - Add local proxy mode subsection Ref: MKT-003 --- README.md | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 7d539e9..5641800 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE) -Run terminal commands through country-specific residential or datacenter proxies. No VPN, no per-tool configuration. Learn more at [shellroute.com](https://shellroute.com/). +**Every terminal can be somewhere else.** Open a proxied shell or route one command, then run your terminal workflow normally. Learn more at [shellroute.com](https://shellroute.com/). ## Install @@ -32,11 +32,13 @@ Supports macOS and Linux. # Log in (creates account if new) shellroute login -# Start a proxy -shellroute proxy --country US +# Open a proxied shell +shellroute +/connect US +curl https://ipinfo.io/json -# In another terminal -curl -x http://127.0.0.1:41900 https://ipinfo.io/ip +# Or route one command +shellroute run DE -- curl https://ipinfo.io/json ``` ## Commands @@ -58,6 +60,17 @@ curl -x http://127.0.0.1:41900 https://ipinfo.io/ip | `shellroute proxy --country ` | Persistent proxy (blocks until Ctrl+C) | | `shellroute proxy stop` | Stop running proxy sessions | +#### Local proxy mode + +For tools configured with an explicit proxy URL: + +```bash +shellroute proxy --country US + +# In another terminal +curl -x http://127.0.0.1:41900 https://ipinfo.io/ip +``` + ### Info | Command | Description | @@ -86,9 +99,9 @@ Run all checks (lint, tests, audit, cross-compile): `./scripts/run-tests.sh`. Re Your terminal -> shellroute CLI (local proxy) -> shellroute API -> Gateway -> Exit IP -> Internet ``` -The CLI runs a local HTTP proxy on `127.0.0.1` and sets `HTTP_PROXY`/`HTTPS_PROXY` for the child process. Proxy-aware tools such as curl, Python Requests, and HTTPX inherit the route. Some clients need explicit configuration. See the [compatibility matrix](docs/compatibility.md) for tested versions and conditions. +Shellroute implements each active route as a local HTTP proxy and provides standard proxy environment variables to the shell or child process. Clients that use those variables send requests through the selected proxy. Each session remains independent, while shellroute manages credentials, rotation, usage, and cleanup. -Traffic exits through residential or datacenter IPs in 120+ countries. +[See what shellroute proxies.](docs/compatibility.md) ## Important From 2a6072ad6f221cd5784ecc1b7e643895fc45c4ff Mon Sep 17 00:00:00 2001 From: contra Date: Thu, 13 Aug 2026 18:30:02 +0300 Subject: [PATCH 04/11] feat: display starter credit message on login (MKT-007) --- internal/api/client.go | 7 ++++--- internal/cli/login.go | 10 ++++++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/internal/api/client.go b/internal/api/client.go index 883a258..e45624a 100644 --- a/internal/api/client.go +++ b/internal/api/client.go @@ -121,9 +121,10 @@ type LocationsResponse struct { } type LoginResponse struct { - APIKey string `json:"api_key,omitempty"` // empty — key is generated locally - Email string `json:"email"` - BalanceUSD float64 `json:"balance_usd"` + APIKey string `json:"api_key,omitempty"` // empty — key is generated locally + Email string `json:"email"` + BalanceUSD float64 `json:"balance_usd"` + StarterCredit string `json:"starter_credit,omitempty"` } type VersionResponse struct { diff --git a/internal/cli/login.go b/internal/cli/login.go index b3f6d6a..625fd16 100644 --- a/internal/cli/login.go +++ b/internal/cli/login.go @@ -118,7 +118,7 @@ func runLoginVerifyCode() error { keyHash := auth.HashClientKey(rawKey) keyPrefix := auth.KeyPrefix(rawKey) - _, err = client.VerifyLoginCode(loginEmail, loginVerifyCode, keyHash, keyPrefix) + resp, err := client.VerifyLoginCode(loginEmail, loginVerifyCode, keyHash, keyPrefix) if err != nil { if apiErr, ok := err.(*api.APIError); ok { display.Error("%s", apiErr.UserMessage()) @@ -135,6 +135,9 @@ func runLoginVerifyCode() error { } display.Success("Logged in successfully") + if resp != nil && resp.StarterCredit != "" { + display.Info("%s", resp.StarterCredit) + } return nil } @@ -181,7 +184,7 @@ func runLoginInteractive() error { keyHash := auth.HashClientKey(rawKey) keyPrefix := auth.KeyPrefix(rawKey) - _, err = client.VerifyLoginCode(email, code, keyHash, keyPrefix) + resp, err := client.VerifyLoginCode(email, code, keyHash, keyPrefix) if err != nil { if apiErr, ok := err.(*api.APIError); ok { display.Error("%s", apiErr.UserMessage()) @@ -198,6 +201,9 @@ func runLoginInteractive() error { } display.Success("Logged in successfully") + if resp != nil && resp.StarterCredit != "" { + display.Info("%s", resp.StarterCredit) + } // Enter interactive mode tui.Version = Version() From f8698e3eb8f2ac506360e621a028a1ed74fb004b Mon Sep 17 00:00:00 2001 From: contra Date: Fri, 14 Aug 2026 09:46:14 +0300 Subject: [PATCH 05/11] fix: /logout uses correct config dir in local mode /logout was hardcoded to ~/.shellroute/config.toml. In local mode (~/.shellroute-mode=local) the config is at ~/.shellroute-local/. Now exports SHELLROUTE_CONFIG_DIR from config.Dir() and /logout reads it with fallback to ~/.shellroute. Signed-off-by: contra --- internal/tui/tui.go | 2 ++ internal/tui/tui_shell.go | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/internal/tui/tui.go b/internal/tui/tui.go index 798d0a1..595d051 100644 --- a/internal/tui/tui.go +++ b/internal/tui/tui.go @@ -114,9 +114,11 @@ func runShell(ctrlPort int, autoConnect string, defaultType string) { if defaultType == "" { defaultType = "residential" } + cfgDir, _ := config.Dir() env := append(os.Environ(), fmt.Sprintf("SHELLROUTE_CTRL=%d", ctrlPort), fmt.Sprintf("SHELLROUTE_IPTYPE=%s", defaultType), + fmt.Sprintf("SHELLROUTE_CONFIG_DIR=%s", cfgDir), "SHELL_SESSIONS_DISABLE=1", // suppress macOS session restore on exit "BASH_SILENCE_DEPRECATION_WARNING=1", // suppress macOS "default shell is now zsh" nag ) diff --git a/internal/tui/tui_shell.go b/internal/tui/tui_shell.go index 9043e03..68213fc 100644 --- a/internal/tui/tui_shell.go +++ b/internal/tui/tui_shell.go @@ -310,8 +310,8 @@ func writeSettingsCommands(f *os.File) { } /logout() { - # Clear stored credentials - local config_file="${HOME}/.shellroute/config.toml" + # Clear stored credentials (respects local mode via SHELLROUTE_CONFIG_DIR) + local config_file="${SHELLROUTE_CONFIG_DIR:-${HOME}/.shellroute}/config.toml" if [ -f "$config_file" ]; then sed -i.bak 's/^api_key = .*/api_key = ""/' "$config_file" 2>/dev/null || \ sed -i '' 's/^api_key = .*/api_key = ""/' "$config_file" 2>/dev/null From ffebf9f31512b9284f0a6eb356b66ecec3767b28 Mon Sep 17 00:00:00 2001 From: contra Date: Fri, 14 Aug 2026 09:51:53 +0300 Subject: [PATCH 06/11] fix: starter credit message displayed with newline and bold Signed-off-by: contra --- internal/cli/login.go | 6 ++++-- internal/display/display.go | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/internal/cli/login.go b/internal/cli/login.go index 625fd16..fcdf874 100644 --- a/internal/cli/login.go +++ b/internal/cli/login.go @@ -136,7 +136,8 @@ func runLoginVerifyCode() error { display.Success("Logged in successfully") if resp != nil && resp.StarterCredit != "" { - display.Info("%s", resp.StarterCredit) + fmt.Fprintln(os.Stderr) + display.InfoBold("%s", resp.StarterCredit) } return nil } @@ -202,7 +203,8 @@ func runLoginInteractive() error { display.Success("Logged in successfully") if resp != nil && resp.StarterCredit != "" { - display.Info("%s", resp.StarterCredit) + fmt.Fprintln(os.Stderr) + display.InfoBold("%s", resp.StarterCredit) } // Enter interactive mode diff --git a/internal/display/display.go b/internal/display/display.go index 85b9c24..d0c3d19 100644 --- a/internal/display/display.go +++ b/internal/display/display.go @@ -44,6 +44,10 @@ func Info(msg string, args ...interface{}) { fmt.Fprintf(os.Stderr, " %s\n", fmt.Sprintf(msg, args...)) } +func InfoBold(msg string, args ...interface{}) { + fmt.Fprintf(os.Stderr, " \033[1m%s\033[0m\n", fmt.Sprintf(msg, args...)) +} + func Label(label, value string) { fmt.Fprintf(os.Stderr, " %s %s\n", labelStyle.Render(label+":"), From 1a7e6619f833498e351d65ee19aafb1441c3fa53 Mon Sep 17 00:00:00 2001 From: contra Date: Fri, 14 Aug 2026 10:01:55 +0300 Subject: [PATCH 07/11] fix: use server low_balance flag instead of hardcoded $0.50 threshold Signed-off-by: contra --- internal/tui/tui.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/tui/tui.go b/internal/tui/tui.go index 595d051..a63c960 100644 --- a/internal/tui/tui.go +++ b/internal/tui/tui.go @@ -25,11 +25,11 @@ func Run(cfg *config.Config) error { client := api.New(cfg.APIURL, cfg.APIKey) - // Show balance warning on startup + // Show balance warning on startup (threshold from server) if bal, err := client.GetBalance(); err == nil { if bal.BalanceUSD == 0 { display.Warn("Balance $0.00 — top up to use at https://console.shellroute.com") - } else if bal.BalanceUSD < 0.50 { + } else if bal.LowBalance { display.Warn("Balance low (%s) — top up at https://console.shellroute.com", display.FormatBalance(bal.BalanceUSD)) } } @@ -58,7 +58,7 @@ func RunWithConnect(cfg *config.Config, country string) error { if bal, err := client.GetBalance(); err == nil { if bal.BalanceUSD == 0 { display.Warn("Balance $0.00 — top up to use at https://console.shellroute.com") - } else if bal.BalanceUSD < 0.50 { + } else if bal.LowBalance { display.Warn("Balance low (%s) — top up at https://console.shellroute.com", display.FormatBalance(bal.BalanceUSD)) } } From 4797ae7f51949cbf272ac2b4a976fe2045e51fc2 Mon Sep 17 00:00:00 2001 From: contra Date: Fri, 14 Aug 2026 10:05:34 +0300 Subject: [PATCH 08/11] refactor: merge Run and RunWithConnect into single Run function RunWithConnect was dead code (never called). Run now takes an optional country parameter for auto-connect. Signed-off-by: contra --- internal/tui/tui.go | 37 ++++++------------------------------- 1 file changed, 6 insertions(+), 31 deletions(-) diff --git a/internal/tui/tui.go b/internal/tui/tui.go index a63c960..63240be 100644 --- a/internal/tui/tui.go +++ b/internal/tui/tui.go @@ -19,8 +19,8 @@ import ( // Version is set by the cli package at startup. var Version = "dev" -// Run starts the interactive shell session. -func Run(cfg *config.Config) error { +// Run starts the interactive shell session. If country is non-empty, auto-connects on start. +func Run(cfg *config.Config, country ...string) error { printBanner() client := api.New(cfg.APIURL, cfg.APIKey) @@ -41,36 +41,11 @@ func Run(cfg *config.Config) error { return fmt.Errorf("control server: %w", err) } - runShell(ctrlPort, "", cfg.DefaultType) - - // Disconnect if session is still active - if resp := ctrl.StopAndDisconnect(); resp != nil { - printSessionSummary(resp) - } - - return nil -} - -// RunWithConnect starts the shell and auto-connects to a country. -func RunWithConnect(cfg *config.Config, country string) error { - client := api.New(cfg.APIURL, cfg.APIKey) - - if bal, err := client.GetBalance(); err == nil { - if bal.BalanceUSD == 0 { - display.Warn("Balance $0.00 — top up to use at https://console.shellroute.com") - } else if bal.LowBalance { - display.Warn("Balance low (%s) — top up at https://console.shellroute.com", display.FormatBalance(bal.BalanceUSD)) - } - } - - ctrl := session.NewController(client, cfg) - - ctrlPort, err := ctrl.Start() - if err != nil { - return fmt.Errorf("control server: %w", err) + autoConnect := "" + if len(country) > 0 { + autoConnect = country[0] } - - runShell(ctrlPort, country, cfg.DefaultType) + runShell(ctrlPort, autoConnect, cfg.DefaultType) if resp := ctrl.StopAndDisconnect(); resp != nil { printSessionSummary(resp) From afaf086b1583ecb17dad38f366488e0fe0bbb930 Mon Sep 17 00:00:00 2001 From: contra Date: Fri, 14 Aug 2026 10:07:49 +0300 Subject: [PATCH 09/11] refactor: remove unused country parameter from Run Signed-off-by: contra --- internal/tui/tui.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/internal/tui/tui.go b/internal/tui/tui.go index 63240be..0f1e47a 100644 --- a/internal/tui/tui.go +++ b/internal/tui/tui.go @@ -19,8 +19,8 @@ import ( // Version is set by the cli package at startup. var Version = "dev" -// Run starts the interactive shell session. If country is non-empty, auto-connects on start. -func Run(cfg *config.Config, country ...string) error { +// Run starts the interactive shell session. +func Run(cfg *config.Config) error { printBanner() client := api.New(cfg.APIURL, cfg.APIKey) @@ -41,11 +41,7 @@ func Run(cfg *config.Config, country ...string) error { return fmt.Errorf("control server: %w", err) } - autoConnect := "" - if len(country) > 0 { - autoConnect = country[0] - } - runShell(ctrlPort, autoConnect, cfg.DefaultType) + runShell(ctrlPort, "", cfg.DefaultType) if resp := ctrl.StopAndDisconnect(); resp != nil { printSessionSummary(resp) From a91852d41d1188b397f8d6cddb5da0047012c290 Mon Sep 17 00:00:00 2001 From: contra Date: Fri, 14 Aug 2026 10:36:59 +0300 Subject: [PATCH 10/11] refactor: remove unused StartWithCredentials Signed-off-by: contra --- internal/session/session.go | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/internal/session/session.go b/internal/session/session.go index 7e26071..0bbb231 100644 --- a/internal/session/session.go +++ b/internal/session/session.go @@ -81,12 +81,6 @@ type StartOpts struct { Mode string // "proxy", "run", or "" (interactive) } -// StartWithCredentials starts a local proxy using pre-existing session credentials -// (from a rotate response). Does not call the API to create a session. -func StartWithCredentials(ctx context.Context, client *api.Client, resp *api.SessionCreateResponse, port int) (*Session, error) { - return startWithResponse(ctx, client, resp, port, StartOpts{}) -} - // Start creates a new session via the API and starts the local proxy. func Start(ctx context.Context, client *api.Client, req *api.SessionCreateRequest, port int, opts ...StartOpts) (*Session, error) { // Bind port before API call — fail fast if port unavailable @@ -112,9 +106,9 @@ func Start(ctx context.Context, client *api.Client, req *api.SessionCreateReques return startWithResponse(ctx, client, resp, port, sOpts) } -// startWithResponse is the shared implementation for Start and StartWithCredentials. +// startWithResponse is the shared implementation for session start. func startWithResponse(ctx context.Context, client *api.Client, resp *api.SessionCreateResponse, port int, opts StartOpts) (*Session, error) { - // If port not yet bound (StartWithCredentials path), bind now + // If port not yet bound, bind now if port == 0 { ln, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { From 764815cd3d0e355901f0cb9db6041e783d53f03d Mon Sep 17 00:00:00 2001 From: contra Date: Tue, 18 Aug 2026 14:36:23 +0300 Subject: [PATCH 11/11] docs: fix quickstart flow, add npm README, set npm versions to 0.0.0 Signed-off-by: contra --- README.md | 14 +++++++++----- npm/cli-darwin-arm64/package.json | 2 +- npm/cli-darwin-x64/package.json | 2 +- npm/cli-linux-arm64/package.json | 2 +- npm/cli-linux-x64/package.json | 2 +- npm/shellroute/README.md | 26 ++++++++++++++++++++++++++ npm/shellroute/package.json | 13 +++++++------ 7 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 npm/shellroute/README.md diff --git a/README.md b/README.md index 5641800..0fb5929 100644 --- a/README.md +++ b/README.md @@ -29,18 +29,22 @@ Supports macOS and Linux. ## Quick start ```bash -# Log in (creates account if new) +# Log in. A new account is created automatically. shellroute login -# Open a proxied shell -shellroute +# Shellroute opens after login. Run these inside it: /connect US curl https://ipinfo.io/json +``` + +### Or route one command -# Or route one command +```bash shellroute run DE -- curl https://ipinfo.io/json ``` +[Read the full quickstart](https://shellroute.com/docs/quickstart?utm_source=github&utm_medium=readme&utm_campaign=cli_readme). + ## Commands ### Authentication @@ -105,7 +109,7 @@ Shellroute implements each active route as a local HTTP proxy and provides stand ## Important -The shellroute CLI is open source. It connects to the shellroute service, which requires a paid account. See [shellroute.com](https://shellroute.com/) for pricing and [acceptable use policy](https://shellroute.com/acceptable-use). +The shellroute CLI is open source and connects to the shellroute service. The service uses prepaid credits. See [pricing](https://shellroute.com/pricing) and the [acceptable use policy](https://shellroute.com/acceptable-use). ## Privacy diff --git a/npm/cli-darwin-arm64/package.json b/npm/cli-darwin-arm64/package.json index 0aa2c57..f78a251 100644 --- a/npm/cli-darwin-arm64/package.json +++ b/npm/cli-darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@shellroute/cli-darwin-arm64", - "version": "0.1.0", + "version": "0.0.0", "os": [ "darwin" ], diff --git a/npm/cli-darwin-x64/package.json b/npm/cli-darwin-x64/package.json index 391beea..b0f0aa1 100644 --- a/npm/cli-darwin-x64/package.json +++ b/npm/cli-darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@shellroute/cli-darwin-x64", - "version": "0.1.0", + "version": "0.0.0", "os": [ "darwin" ], diff --git a/npm/cli-linux-arm64/package.json b/npm/cli-linux-arm64/package.json index 414a040..322d9c8 100644 --- a/npm/cli-linux-arm64/package.json +++ b/npm/cli-linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@shellroute/cli-linux-arm64", - "version": "0.1.0", + "version": "0.0.0", "os": [ "linux" ], diff --git a/npm/cli-linux-x64/package.json b/npm/cli-linux-x64/package.json index f0dd549..c689459 100644 --- a/npm/cli-linux-x64/package.json +++ b/npm/cli-linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@shellroute/cli-linux-x64", - "version": "0.1.0", + "version": "0.0.0", "os": [ "linux" ], diff --git a/npm/shellroute/README.md b/npm/shellroute/README.md new file mode 100644 index 0000000..64eda35 --- /dev/null +++ b/npm/shellroute/README.md @@ -0,0 +1,26 @@ +# shellroute + +A proxied shell for terminal workflows. Every terminal can be somewhere else. + +## Install + +```bash +npm install -g shellroute +``` + +## First session + +```bash +# Log in. A new account is created automatically. +shellroute login + +# Shellroute opens after login. Run these inside it: +/connect US +curl https://ipinfo.io/json +``` + +[Follow the two-minute quickstart](https://shellroute.com/docs/quickstart?utm_source=npm&utm_medium=package-readme&utm_campaign=cli_readme). + +The CLI is open source and connects to the shellroute service. The service uses prepaid credits. + +[GitHub](https://github.com/shellroute/shellroute-cli) · [Pricing](https://shellroute.com/pricing) · [Compatibility](https://shellroute.com/docs/compatibility) · [Acceptable use](https://shellroute.com/acceptable-use) diff --git a/npm/shellroute/package.json b/npm/shellroute/package.json index 89ca401..2a79370 100644 --- a/npm/shellroute/package.json +++ b/npm/shellroute/package.json @@ -1,6 +1,6 @@ { "name": "shellroute", - "version": "0.1.0", + "version": "0.0.0", "description": "A proxied shell for terminal workflows. Open a session, choose a proxy, and run commands normally.", "license": "Apache-2.0", "repository": { @@ -11,16 +11,17 @@ "files": [ "bin", "LICENSE", - "NOTICE" + "NOTICE", + "README.md" ], "bin": { "shellroute": "bin/shellroute" }, "optionalDependencies": { - "@shellroute/cli-darwin-arm64": "0.1.0", - "@shellroute/cli-darwin-x64": "0.1.0", - "@shellroute/cli-linux-arm64": "0.1.0", - "@shellroute/cli-linux-x64": "0.1.0" + "@shellroute/cli-darwin-arm64": "0.0.0", + "@shellroute/cli-darwin-x64": "0.0.0", + "@shellroute/cli-linux-arm64": "0.0.0", + "@shellroute/cli-linux-x64": "0.0.0" }, "keywords": [ "automation",