{"id":48513004,"url":"https://github.com/bsreeram08/gurl","last_synced_at":"2026-05-22T23:03:20.351Z","repository":{"id":349805463,"uuid":"1203919926","full_name":"bsreeram08/gurl","owner":"bsreeram08","description":"GURL = Gurl's Universal Request Library. A smart curl saver and API companion.","archived":false,"fork":false,"pushed_at":"2026-05-18T05:17:44.000Z","size":45541,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-18T06:50:58.074Z","etag":null,"topics":["ai-agent","api-client","cli","curl","developer-tools","go","golang","http-client","rest-api","terminal","tui"],"latest_commit_sha":null,"homepage":"https://bsreeram08.github.io/gurl/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bsreeram08.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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-04-07T14:10:40.000Z","updated_at":"2026-04-20T19:36:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bsreeram08/gurl","commit_stats":null,"previous_names":["bsreeram08/gurl"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/bsreeram08/gurl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsreeram08%2Fgurl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsreeram08%2Fgurl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsreeram08%2Fgurl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsreeram08%2Fgurl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bsreeram08","download_url":"https://codeload.github.com/bsreeram08/gurl/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsreeram08%2Fgurl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33376007,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-22T21:56:13.512Z","status":"ssl_error","status_checked_at":"2026-05-22T21:56:10.769Z","response_time":265,"last_error":"SSL_read: 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":["ai-agent","api-client","cli","curl","developer-tools","go","golang","http-client","rest-api","terminal","tui"],"created_at":"2026-04-07T18:01:15.488Z","updated_at":"2026-05-22T23:03:20.346Z","avatar_url":"https://github.com/bsreeram08.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Gurl — Your API Workspace, in the Terminal\n\n[![Latest Release](https://img.shields.io/github/v/release/bsreeram08/gurl)](https://github.com/bsreeram08/gurl/releases/latest)\n[![Go Version](https://img.shields.io/badge/go-1.25.0%2B-blue)](https://go.dev)\n[![License](https://img.shields.io/badge/license-MIT-green)](LICENSE)\n\n![gurl logo](assets/logo.jpg)\n\nImport from Postman. Run with environments. Assert on responses. Generate client code. All without leaving your shell.\n\n**Gurl is not a curl wrapper.** It's a full API development environment — collections, environments, scripting, assertions, history, and multi-protocol support — built for the terminal. If Postman and httpie had a baby that grew up in a shell, this is it.\n\n### Why not just use...?\n\n| Feature | httpie / xh | Hurl | ATAC | Slumber | Bruno CLI | **gurl** |\n|---------|:-----------:|:----:|:----:|:-------:|:---------:|:--------:|\n| Save \u0026 replay named requests | ❌ | file | ✅ | ✅ | ✅ | ✅ |\n| Environments (dev/staging/prod) | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |\n| Import from Postman/Insomnia/OpenAPI | ❌ | HAR | ❌ | Insomnia | ✅ | ✅ |\n| Scripting (pre/post-request hooks) | ❌ | ❌ | Rhai | ❌ | ❌ | **JS** |\n| Response assertions | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ |\n| Collection runner (data-driven) | ❌ | ❌ | ❌ | ❌ | CSV | ✅ |\n| Multi-protocol (HTTP, GQL, gRPC, WS, SSE) | ❌ | HTTP | ❌ | HTTP | HTTP | **✅** |\n| Execution history + diff | session | ❌ | ❌ | SQLite | ❌ | ✅ |\n| Interactive TUI | ❌ | ❌ | ✅ | ✅ | ❌ | ✅ |\n| Code generation (curl/Go/Python/JS) | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |\n\n- **httpie / xh** — beautiful one-shot requests. No persistence, no collections, no environments.\n- **Hurl** — excellent for CI testing with `.hurl` files. No TUI, no scripting, no environments, HTTP only.\n- **ATAC** — closest Postman-in-terminal experience. Rust TUI with collections. No JS scripting, no import from Postman, no codegen.\n- **Slumber** — YAML-based TUI REST client with profiles. No scripting, no assertions, HTTP only.\n- **Bruno CLI** — runs `.bru` collections. GUI needed for authoring. No interactive exploration.\n\n## What it looks like\n\n![gurl TUI](assets/tui-mockup.jpg)\n\n## Features\n\n- **Named requests** — save any curl command with a memorable name, run it forever\n- **Variable templates** — auto-detect IDs/UUIDs, substitute at runtime with `--var`\n- **Environments** — swap base URLs, secrets, and tokens between dev/staging/prod\n- **Import** — OpenAPI, Insomnia, Bruno, Postman, HAR\n- **Auth handlers** — Basic, Bearer, API Key, Digest, OAuth 1/2, AWS SigV4, NTLM\n- **Protocols** — HTTP, GraphQL, gRPC, WebSocket, SSE\n- **Scripting** — JavaScript pre/post-request hooks via goja runtime\n- **Assertions** — assert on status, headers, body, and extracted variables (`extract:varName`)\n- **Request chaining** - route follow-up requests with `setNextRequest`, `run-if`, and extracted variables\n- **Collection runner** - data-driven testing with CSV/JSON input, dry runs, and assertion bail mode\n- **Code generation** — generate curl, Go, Python, JavaScript from any saved request\n- **Interactive TUI** — full bubbletea interface for browsing and running requests\n- **Execution history** — per-request history + global timeline + diff between runs\n- **Plugin system** — middleware, custom output formatters, commands, and auth handlers\n\n## Key capabilities\n\n![gurl features](assets/features.jpg)\n\n## Installation\n\n### Homebrew (macOS / Linux)\n\n```bash\nbrew tap bsreeram08/gurl https://github.com/bsreeram08/gurl\nbrew install gurl\n```\n\n### One-liner\n\n```bash\ncurl -sL https://raw.githubusercontent.com/bsreeram08/gurl/master/scripts/install.sh | bash\n```\n\n### Pre-built Binaries\n\nDownload from [GitHub Releases](https://github.com/bsreeram08/gurl/releases/latest):\n\n```bash\n# macOS (Apple Silicon)\ncurl -LO https://github.com/bsreeram08/gurl/releases/latest/download/gurl-darwin-arm64.tar.gz\ntar -xzf gurl-darwin-arm64.tar.gz \u0026\u0026 sudo mv gurl /usr/local/bin/gurl\n\n# Linux (amd64)\ncurl -LO https://github.com/bsreeram08/gurl/releases/latest/download/gurl-linux-amd64.tar.gz\ntar -xzf gurl-linux-amd64.tar.gz \u0026\u0026 sudo mv gurl /usr/local/bin/gurl\n\n# Linux (arm64)\ncurl -LO https://github.com/bsreeram08/gurl/releases/latest/download/gurl-linux-arm64.tar.gz\ntar -xzf gurl-linux-arm64.tar.gz \u0026\u0026 sudo mv gurl /usr/local/bin/gurl\n```\n\n### Build from Source\n\n```bash\ngit clone https://github.com/bsreeram08/gurl.git\ncd gurl\ngo build -o gurl ./cmd/gurl\nsudo mv gurl /usr/local/bin/\ngurl --version\n```\n\n## Quick Start\n\n```bash\n# Save a request\ngurl save \"health\" https://api.example.com/health\n\n# Save with full curl flags\ngurl save \"create-order\" https://api.example.com/orders \\\n  -X POST \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer {{token}}\" \\\n  -d '{\"customer_id\": \"{{customerId}}\"}'\n\n# Or pipe a raw curl string\necho 'curl -X POST https://api.example.com/orders -d \"{}\"' | gurl save \"create-order\"\n\n# Run it\ngurl run \"create-order\" --var token=abc123 --var customerId=42\n\n# List all saved requests\ngurl list\n```\n\n## Real Workflows\n\n### Migrate from Postman, keep your terminal\n\n```bash\n# Import your existing collection\ngurl import postman ./my-collection.json\n\n# Everything is here — names, auth, variables\ngurl list\ngurl run \"Get Users\" --env staging\n```\n\n### Test APIs with scripting and assertions\n\n```bash\n# Save extraction and scripts on a request\ngurl save \"login\" https://api.example.com/auth/login \\\n  -X POST \\\n  --extract token=jsonpath:$.token \\\n  --post-script \"gurl.setNextRequest('profile')\"\n\n# Run the chain, then persist extracted/script variables to the environment\ngurl run \"login\" --env dev --chain --persist --assert \"extract:token != ''\"\n```\n\n### Save authentication with the request\n\n```bash\n# Discover the handlers and their parameters\ngurl auth list\ngurl auth info bearer\n\n# Save a bearer token once, then run the request later\ngurl save \"profile\" https://api.example.com/me \\\n  --auth bearer \\\n  --auth-param token='{{token}}'\n\ngurl run \"profile\" --var token=abc123\n\n# Basic auth and API keys work the same way\ngurl save \"admin\" https://api.example.com/admin \\\n  --auth basic \\\n  --auth-param username='{{user}}' \\\n  --auth-param password='{{password}}'\n\ngurl save \"search\" https://api.example.com/search \\\n  --auth apikey \\\n  --auth-param header=X-API-Key \\\n  --auth-param value='{{api_key}}'\n```\n\nAuth parameters use repeated `--auth-param key=value` flags. Saved auth settings are applied when you run the request, after variable templates are substituted.\n\n### Run collections with data-driven inputs\n\n```bash\n# Run every request in a collection with CSV test data\ngurl collection run \"checkout-flow\" --data ./test-data.csv --env staging\n\n# Preview the flow without sending requests\ngurl collection run \"checkout-flow\" --env staging --dry-run\n\n# Stop only when an assertion fails\ngurl collection run \"checkout-flow\" --env staging --assert-bail\n```\n\n### Compare responses over time\n\n```bash\n# See what changed between the last two runs\ngurl diff \"get-user\"\n\n# Or browse the full timeline\ngurl timeline --pattern \"get-*\"\n```\n\n### Generate client code from saved requests\n\n```bash\ngurl codegen \"create-order\" --lang python\ngurl codegen \"create-order\" --lang javascript\ngurl codegen \"create-order\" --lang go\ngurl codegen \"create-order\" --lang curl\n```\n\n## All Commands\n\n| Command | Description |\n|---------|-------------|\n| `save` | Save a request (flags or raw curl string) |\n| `run` | Execute a saved request with variable substitution |\n| `list` | List saved requests (filter by collection, tag, pattern) |\n| `auth` | Discover supported authentication types and parameters |\n| `detect` | Parse curl from stdin interactively (TUI) |\n| `edit` | Edit a saved request in TUI form |\n| `delete` | Delete a saved request |\n| `rename` | Rename a saved request |\n| `show` | Show full request details |\n| `history` | Show execution history for a request |\n| `timeline` | Global execution timeline across all requests |\n| `diff` | Compare last two responses for a request |\n| `env` | Manage environments (create, list, show, switch) |\n| `collection` | Manage collections |\n| `sequence` | Run multiple requests in sequence |\n| `graphql` | Execute a GraphQL query |\n| `export` | Export requests to JSON |\n| `import` | Import from OpenAPI/Insomnia/Bruno/Postman/HAR |\n| `paste` | Copy request as curl command to clipboard |\n| `codegen` | Generate code (curl, Go, Python, JavaScript) |\n| `tui` | Launch full interactive TUI |\n| `update` | Self-update to latest release |\n\n## Environments\n\n```bash\n# Create environments\ngurl env create dev --var \"BASE_URL=https://dev.api.com\" --secret \"API_KEY=sk-dev-123\"\ngurl env create prod --var \"BASE_URL=https://api.com\" --secret \"API_KEY=sk-prod-456\"\n\n# Run with an environment\ngurl run \"create-order\" --env prod\n\n# Switch default environment\ngurl env use dev\n```\n\nSecrets are encrypted at rest with AES-256-GCM and never appear in logs or generated code.\n\n## Configuration\n\n`~/.config/gurl/config.toml` or `~/.gurlrc`:\n\n```toml\n[general]\nhistory_depth = 100\nauto_template = true\ntimeout = \"30s\"\n\n[output]\ndefault_format = \"auto\"\nsyntax_highlight = true\njson_pretty = true\n```\n\n## Agent Skills\n\nFor AI coding agents (Cursor, Claude Code, etc.):\n\n```bash\nnpx skills add https://github.com/bsreeram08/gurl\n```\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbsreeram08%2Fgurl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbsreeram08%2Fgurl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbsreeram08%2Fgurl/lists"}