{"id":51398153,"url":"https://github.com/imatson9119/curl-snap","last_synced_at":"2026-07-04T04:04:40.951Z","repository":{"id":366897487,"uuid":"1278329007","full_name":"imatson9119/curl-snap","owner":"imatson9119","description":"Turn a curl request into a polished PNG for PR evidence — runs the request and screenshots a clean card of the route, headers, request, and response.","archived":false,"fork":false,"pushed_at":"2026-06-23T19:01:32.000Z","size":2485,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-23T20:20:48.114Z","etag":null,"topics":["api","cli","curl","developer-tools","http","nodejs","pull-request","screenshot"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/imatson9119.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","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-06-23T17:28:54.000Z","updated_at":"2026-06-23T19:01:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/imatson9119/curl-snap","commit_stats":null,"previous_names":["imatson9119/curl-snap"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/imatson9119/curl-snap","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imatson9119%2Fcurl-snap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imatson9119%2Fcurl-snap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imatson9119%2Fcurl-snap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imatson9119%2Fcurl-snap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/imatson9119","download_url":"https://codeload.github.com/imatson9119/curl-snap/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imatson9119%2Fcurl-snap/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35109218,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-04T02:00:05.987Z","response_time":113,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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","cli","curl","developer-tools","http","nodejs","pull-request","screenshot"],"created_at":"2026-07-04T04:04:40.062Z","updated_at":"2026-07-04T04:04:40.945Z","avatar_url":"https://github.com/imatson9119.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# curl-snap\n\n[![npm version](https://img.shields.io/npm/v/curl-snap.svg)](https://www.npmjs.com/package/curl-snap)\n[![node](https://img.shields.io/node/v/curl-snap.svg)](https://nodejs.org)\n[![license: MIT](https://img.shields.io/npm/l/curl-snap.svg)](LICENSE)\n\n**Run a curl command and turn the request + response into a clean, shareable image.**\n\ncurl-snap parses your curl, runs it, and renders a tidy card of the route,\nheaders, request, and response — themed, redacted, and ready to drop into a PR, a\ndoc, a blog post, or a tweet. The whole loop is: copy a curl → `curl-snap` →\npaste the image.\n\n![A curl-snap card](samples/happy-post.png)\n\nSecrets are masked by default, because pasting a live bearer token somewhere\npublic is a great way to have a bad afternoon.\n\n## Install\n\n**npm** (it's a Node CLI, so this is the path of least resistance):\n\n```sh\nnpm install -g curl-snap\n```\n\n**Homebrew** (macOS/Linux):\n\n```sh\nbrew tap imatson9119/tap\nbrew install curl-snap\n```\n\n**From source:**\n\n```sh\ngit clone https://github.com/imatson9119/curl-snap.git\ncd curl-snap \u0026\u0026 npm install \u0026\u0026 npm link\n```\n\nNo browser required — curl-snap renders in-process with bundled fonts, so there's\nnothing else to install. Clipboard auto-copy works on macOS, Linux\n(`xclip`/`wl-copy`), and Windows/WSL; everywhere else it saves a file instead.\n\n## Quick start\n\n```sh\n# Paste a curl as an argument\ncurl-snap \"curl -X POST https://api.example.com/users \\\n  -H 'Authorization: Bearer abc123' -H 'Content-Type: application/json' \\\n  -d '{\\\"name\\\":\\\"Ada\\\"}'\"\n\n# ...or pipe it in\npbpaste | curl-snap\n\n# ...or copy a curl from anywhere and read it off the clipboard\ncurl-snap -c\n\n# ...or read it from a file (handy for bodies full of quotes — no shell escaping)\ncurl-snap -f request.curl\n\n# ...or just run curl-snap and paste it when prompted (Ctrl-D to render)\ncurl-snap\n```\n\nBy default the image lands **on your clipboard** (ready to paste) plus a quick\nstatus/timing summary in the terminal — no file is written. Pass `--out` (or\n`--out-dir`) when you want to keep one on disk. Run `curl-snap --help` for every\nflag.\n\n## Features\n\n- **14 color themes** + fully custom palettes — see [Themes](https://github.com/imatson9119/curl-snap/blob/main/docs/themes.md).\n- **Backdrops \u0026 window chrome** for share-ready images (color/gradient/`auto`\n  background, padding, title bar) — see [Usage › Backdrops](https://github.com/imatson9119/curl-snap/blob/main/docs/usage.md#backdrops--window-chrome).\n- **PNG or SVG** output, at any scale — see [Usage › Output](https://github.com/imatson9119/curl-snap/blob/main/docs/usage.md#output-format--scale).\n- **Secret redaction** on by default (see [below](#redacting-secrets)).\n- **Upload \u0026 share a link** with a built-in confirmation gate — see\n  [Usage › Uploading](https://github.com/imatson9119/curl-snap/blob/main/docs/usage.md#uploading--sharing-a-link).\n- **JSON / XML / HTML / form** body highlighting, plus `curl -F` multipart.\n- **Big-response controls** (`--max-body-lines`, `--max-body-depth`).\n- **Config files + verbosity levels** — see\n  [Configuration](https://github.com/imatson9119/curl-snap/blob/main/docs/configuration.md)\n  and [Usage › Verbosity](https://github.com/imatson9119/curl-snap/blob/main/docs/usage.md#verbosity).\n\n## Common options\n\n| Flag | What it does |\n| --- | --- |\n| `-o, --out \u003cfile\u003e` | Save the image (otherwise it's clipboard-only) |\n| `--format \u003cfmt\u003e` | `png` (default) or `svg` |\n| `--theme \u003cname\u003e` | Color theme (default `gruvbox`) · `curl-snap themes` to browse + set one |\n| `--background \u003cv\u003e` | Backdrop: `none` (default), a CSS color/gradient, or `auto` |\n| `--no-redact` | Show sensitive values (masked by default) |\n| `--upload` | Upload the image and print a link (asks first) |\n| `-v` / `-vv` | More detail on the card (headers, sizes, source curl) |\n| `--width \u003cpx\u003e` | Card width (default 760) |\n| `--no-window` | Drop the title bar for a flat, full-bleed card |\n\nRun `--help` for every flag, or see the full reference in\n[Usage](https://github.com/imatson9119/curl-snap/blob/main/docs/usage.md).\n\n## Redacting secrets\n\nOn by default. Anything that looks sensitive gets swapped for `••••••`:\n\n- **Headers** — `Authorization` (keeps the scheme: `Bearer ••••••`), `Cookie`,\n  `X-Api-Key`, and any header whose name smells secret.\n- **JSON keys**, recursively — `password`, `secret`, `token`, `api_key`,\n  `client_secret`, `ssn`, `card`, and friends.\n- **Form bodies** and **query params** with sensitive names.\n- **Token-shaped values** — JWTs (`xxx.yyy.zzz`) and `Bearer`/`Basic` tokens get\n  masked even when the key name isn't obviously secret.\n\nAdd your own with `--redact billing_id`, pull something back with `--reveal token`,\nor turn it all off with `--no-redact`.\n\n\u003e It's still best-effort — a high-entropy secret that isn't JWT- or bearer-shaped\n\u003e and sits under an innocent key can slip through. Glance at the response before\n\u003e sharing if your API echoes raw values.\n\n## How it works\n\nParse the curl into method / URL / headers / body → run it with Node's built-in\n`fetch` → redact anything sensitive (for display only) → render the card to SVG\nwith [`satori`](https://github.com/vercel/satori) and rasterize it with\n[`resvg`](https://github.com/yisibl/resvg-js). No browser, no system fonts —\noutput is deterministic across machines.\n\n## Limitations\n\n- The request goes through `fetch`, not the real `curl` binary, from the parsed\n  pieces of your command. Most common flags work (`-X`, `-H`, `-d`/`--data*`,\n  `--json`, `-F`/`--form` incl. `@file`, `-u`, `-b`, `-G`, `-k`, `-m`, `-L`,\n  `--compressed`, …); anything fancier (client certs, proxies) warns rather than\n  crashes.\n- One image per request — no combined happy+sad stacking yet.\n\n## Contributing\n\nPRs welcome — see [CONTRIBUTING.md](CONTRIBUTING.md). It's a small codebase and\nintentionally dependency-light.\n\n## License\n\n[MIT](LICENSE) © Ian Matson\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimatson9119%2Fcurl-snap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fimatson9119%2Fcurl-snap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimatson9119%2Fcurl-snap/lists"}