{"id":44528988,"url":"https://github.com/sadopc/gottp","last_synced_at":"2026-02-17T22:00:55.886Z","repository":{"id":337775521,"uuid":"1155143446","full_name":"sadopc/gottp","owner":"sadopc","description":"A Postman/Insomnia-like TUI API client built in Go with Bubble Tea","archived":false,"fork":false,"pushed_at":"2026-02-11T18:32:15.000Z","size":595,"stargazers_count":22,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-16T00:41:13.017Z","etag":null,"topics":["api-client","api-testing","bubble-tea","cli","developer-tools","go","graphql","grpc","http-client","insomnia","postman","rest-api","terminal","tui","websocket"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sadopc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-11T07:05:21.000Z","updated_at":"2026-02-15T07:34:21.000Z","dependencies_parsed_at":"2026-02-14T19:01:48.951Z","dependency_job_id":null,"html_url":"https://github.com/sadopc/gottp","commit_stats":null,"previous_names":["sadopc/gottp"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/sadopc/gottp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sadopc%2Fgottp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sadopc%2Fgottp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sadopc%2Fgottp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sadopc%2Fgottp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sadopc","download_url":"https://codeload.github.com/sadopc/gottp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sadopc%2Fgottp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29518584,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-16T18:37:19.720Z","status":"ssl_error","status_checked_at":"2026-02-16T18:36:46.920Z","response_time":115,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-client","api-testing","bubble-tea","cli","developer-tools","go","graphql","grpc","http-client","insomnia","postman","rest-api","terminal","tui","websocket"],"created_at":"2026-02-13T18:24:35.495Z","updated_at":"2026-02-16T21:01:26.198Z","avatar_url":"https://github.com/sadopc.png","language":"Go","readme":"\u003ch1 align=\"center\"\u003egottp\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\u003cstrong\u003eAPI client for your terminal.\u003c/strong\u003e\u003cbr\u003eHTTP, GraphQL, WebSocket, and gRPC — all from a single TUI.\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/sadopc/gottp/releases/latest\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/sadopc/gottp?style=flat-square\u0026color=cba6f7\" alt=\"Release\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Go-1.25-00ADD8?style=flat-square\u0026logo=go\u0026logoColor=white\" alt=\"Go\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/License-MIT-blue?style=flat-square\" alt=\"License\"\u003e\n  \u003ca href=\"https://github.com/sadopc/gottp/releases\"\u003e\u003cimg src=\"https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20Windows-lightgrey?style=flat-square\" alt=\"Platform\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"screenshot.png\" alt=\"gottp — three-panel TUI with collections sidebar, request editor, and response viewer\" width=\"800\"\u003e\n\u003c/p\u003e\n\n---\n\n## Install\n\n```bash\nbrew install sadopc/tap/gottp          # Homebrew (macOS/Linux)\ngo install github.com/sadopc/gottp/cmd/gottp@latest   # Go\n```\n\nOr download a binary from the [latest release](https://github.com/sadopc/gottp/releases/latest).\n\n## Quick Start\n\n```bash\ngottp                                  # launch TUI (auto-discovers .gottp.yaml in cwd)\ngottp --collection my-api.gottp.yaml   # open a specific collection\ngottp run api.gottp.yaml --env Prod    # headless run (CI-friendly)\ngottp mock api.gottp.yaml --port 8080  # start a mock server\n```\n\n## Features\n\n| | |\n|---|---|\n| **4 protocols** | HTTP, GraphQL (subscriptions, introspection), WebSocket, gRPC (reflection, streaming) |\n| **Vim-style editing** | Normal / Insert / Jump / Search modes, `j`/`k` nav, `f` jump-to-label |\n| **7 auth methods** | Basic, Bearer, API Key, OAuth2 (PKCE), AWS SigV4, Digest, None |\n| **Environments** | `{{variable}}` interpolation, `Ctrl+E` to switch, AES-256-GCM encrypted secrets |\n| **Scripting** | Pre/post-request JavaScript (ES5.1+) — mutate requests, assert responses, chain variables |\n| **Import/Export** | cURL, Postman, Insomnia, OpenAPI 3.0, HAR — auto-detected on import |\n| **Code generation** | Go, Python, JavaScript, cURL, Ruby, Java, Rust, PHP |\n| **Response diffing** | Set a baseline, compare with Myers diff (line + word-level highlighting) |\n| **Performance timing** | DNS, TCP, TLS, TTFB, Transfer breakdown per request |\n| **Mock server** | `gottp mock` with configurable latency, error rates, and CORS |\n| **Workflows** | Chain requests with variable extraction between steps |\n| **8+ themes** | Catppuccin (4 variants), Nord, Dracula, Gruvbox, Tokyo Night, or bring your own YAML |\n\n## CLI Commands\n\n```\ngottp                    TUI mode (default)\ngottp run                Run requests headless (--output json|junit, --workflow, --perf-baseline)\ngottp mock               Start mock server from collection\ngottp init               Scaffold a new collection\ngottp validate           Validate collection/environment YAML\ngottp fmt                Format and normalize collection files\ngottp import             Import from file (auto-detects format)\ngottp export             Export to cURL or HAR\ngottp completion         Shell completions (bash, zsh, fish)\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eKey Bindings\u003c/strong\u003e\u003c/summary\u003e\n\n### Global\n\n| Key | Action |\n|-----|--------|\n| `Ctrl+Enter` | Send request |\n| `S` | Send request (normal mode) |\n| `Ctrl+K` | Command palette |\n| `Ctrl+P` | Switch protocol |\n| `Ctrl+E` | Switch environment |\n| `Ctrl+N` / `Ctrl+W` | New / close tab |\n| `Ctrl+S` | Save request |\n| `Tab` / `Shift+Tab` | Cycle panel focus |\n| `[` / `]` | Previous / next tab |\n| `f` | Jump mode |\n| `E` | Edit body in `$EDITOR` |\n| `?` | Help |\n\n### Sidebar\n\n| Key | Action |\n|-----|--------|\n| `b` | Toggle sidebar |\n| `j` / `k` | Navigate |\n| `Enter` | Open request |\n| `/` | Search |\n\n### Editor\n\n| Key | Action |\n|-----|--------|\n| `i` | Insert mode |\n| `Esc` | Normal mode |\n| `h` / `l` | Switch sub-tab |\n| `1`-`6` | Jump to sub-tab |\n\n### Response\n\n| Key | Action |\n|-----|--------|\n| `j` / `k` | Scroll |\n| `1`-`6` | Switch tab (Body, Headers, Cookies, Timing, Diff, Console) |\n| `/` or `Ctrl+F` | Search body |\n| `n` / `N` | Next / prev match |\n| `w` | Toggle word wrap |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCollection Format\u003c/strong\u003e\u003c/summary\u003e\n\nCollections are stored as readable `.gottp.yaml` files:\n\n```yaml\nname: My API\nversion: \"1\"\nitems:\n  - folder:\n      name: Users\n      items:\n        - request:\n            name: List Users\n            method: GET\n            url: \"{{base_url}}/users\"\n            headers:\n              - { key: Accept, value: application/json, enabled: true }\n        - request:\n            name: Create User\n            method: POST\n            url: \"{{base_url}}/users\"\n            body:\n              type: json\n              content: '{\"name\": \"test\"}'\n```\n\nEnvironment files (`environments.yaml`) sit alongside the collection:\n\n```yaml\nenvironments:\n  - name: Development\n    variables:\n      base_url: \"http://localhost:3000\"\n      api_key: \"dev-key-123\"\n  - name: Production\n    variables:\n      base_url: \"https://api.example.com\"\n      api_key: \"prod-key-456\"\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eScripting API\u003c/strong\u003e\u003c/summary\u003e\n\nPre-scripts can mutate the request; post-scripts assert on the response. Each runs in a fresh JS runtime with a 5s timeout.\n\n```javascript\n// Pre-script\ngottp.request.setHeader(\"X-Request-ID\", gottp.uuid());\n\n// Post-script\ngottp.test(\"Status is 200\", function() {\n  gottp.assert(gottp.response.statusCode === 200);\n});\ngottp.setEnvVar(\"token\", JSON.parse(gottp.response.body).token);\n```\n\n| Function | Description |\n|----------|-------------|\n| `gottp.setEnvVar(key, val)` / `getEnvVar(key)` | Read/write environment variables |\n| `gottp.test(name, fn)` / `assert(cond, msg)` | Test assertions |\n| `gottp.log(...)` | Log to script console |\n| `gottp.uuid()` | UUID v4 |\n| `gottp.timestamp()` / `timestampMs()` | Unix timestamps |\n| `gottp.randomInt(min, max)` | Random integer |\n| `gottp.base64encode` / `base64decode` | Base64 |\n| `gottp.sha256` / `md5` / `hmacSha256` | Hashing |\n| `gottp.sleep(ms)` | Sleep (max 10s) |\n| `gottp.readFile(path)` | Read file from disk |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eConfiguration\u003c/strong\u003e\u003c/summary\u003e\n\n`~/.config/gottp/config.yaml`:\n\n```yaml\ntheme: catppuccin-mocha\nvim_mode: true\ndefault_timeout: 30s\neditor: \"\"              # defaults to $EDITOR\nscript_timeout: 5s\nproxy_url: \"\"           # HTTP/HTTPS/SOCKS5\nno_proxy: \"localhost\"\ntls:\n  cert_file: \"\"\n  key_file: \"\"\n  ca_file: \"\"\n  insecure_skip_verify: false\n```\n\nCustom themes go in `~/.config/gottp/themes/` as YAML files.\n\n\u003c/details\u003e\n\n## License\n\n[MIT](LICENSE)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsadopc%2Fgottp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsadopc%2Fgottp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsadopc%2Fgottp/lists"}