{"id":27107810,"url":"https://github.com/trinhminhtriet/curli","last_synced_at":"2025-04-06T21:28:10.880Z","repository":{"id":262101735,"uuid":"886208857","full_name":"trinhminhtriet/curli","owner":"trinhminhtriet","description":"🌀 Curli: A user-friendly curl interface combining HTTPie’s simplicity with curl’s full functionality and power.","archived":false,"fork":false,"pushed_at":"2025-04-06T16:25:40.000Z","size":360,"stargazers_count":11,"open_issues_count":2,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-06T16:29:51.129Z","etag":null,"topics":["cli","curl","developer-tools","http-client","httpie"],"latest_commit_sha":null,"homepage":"","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/trinhminhtriet.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"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}},"created_at":"2024-11-10T13:43:07.000Z","updated_at":"2025-04-06T16:25:43.000Z","dependencies_parsed_at":"2024-11-10T15:26:37.315Z","dependency_job_id":"8dd9e844-a34e-40c2-84d7-713829960802","html_url":"https://github.com/trinhminhtriet/curli","commit_stats":null,"previous_names":["trinhminhtriet/curli"],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trinhminhtriet%2Fcurli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trinhminhtriet%2Fcurli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trinhminhtriet%2Fcurli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trinhminhtriet%2Fcurli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/trinhminhtriet","download_url":"https://codeload.github.com/trinhminhtriet/curli/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247553210,"owners_count":20957431,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["cli","curl","developer-tools","http-client","httpie"],"created_at":"2025-04-06T21:28:10.415Z","updated_at":"2025-04-06T21:28:10.866Z","avatar_url":"https://github.com/trinhminhtriet.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Curli 🌀\n\n```text\n\n                    _  _\n  ___  _   _  _ __ | |(_)\n / __|| | | || '__|| || |\n| (__ | |_| || |   | || |\n \\___| \\__,_||_|   |_||_|\n\n```\n\n**Curli** is a lightweight, user-friendly interface for `curl`, blending the simplicity of **HTTPie** with the robust functionality of **curl**. With Curli, you can leverage all the power of `curl` commands, enhanced with syntax sugar and formatted output inspired by HTTPie. Perfect for developers who want the best of both worlds — quick, readable commands without sacrificing advanced options.\n\n## ✨ Features\n\n- All `curl` options, with added usability enhancements\n- Clean, readable output for easy debugging\n- Supports complex requests with simplified syntax\n\n## 🚀 Installation\n\nDownload a [binary package](https://github.com/trinhminhtriet/curli/releases)\n\n### Build with goreleaser\n\nBuild with [goreleaser](https://goreleaser.com) to test that all platforms compile properly.\n\n```sh\ngoreleaser build --clean --snapshot\n```\n\nOr for your current platform only.\n\n```sh\ngoreleaser build --clean --snapshot --single-target\n```\n\n### Build Docker image\n\n```sh\ndocker build -t trinhminhtriet/curli .\n```\n\n## 💡 Usage\n\n### Docker\n\n```sh\ndocker run --rm -it trinhminhtriet/curli [CURL_OPTIONS...] [METHOD] URL [ITEM [ITEM]]\n\ndocker run --rm -it trinhminhtriet/curli version\ndocker run --rm -it trinhminhtriet/curli -I https://github.com\n```\n\n```sh\nSynopsis:\n\n$ curli [CURL_OPTIONS...] [METHOD] URL [ITEM [ITEM]]\nUsage: curli [options...] [METHOD] URL [REQUEST_ITEM [REQUEST_ITEM ...]]\n     --abstract-unix-socket \u003cpath\u003e   Connect via abstract Unix domain socket\n     --alt-svc \u003cfilename\u003e            Enable alt-svc with this cache file\n     --anyauth                       Pick any authentication method\n -a, --append                        Append to target file when uploading\n     --aws-sigv4 \u003cprovider1[:prvdr2[:reg[:srv]]]\u003e  AWS V4 signature auth\n     --basic                         HTTP Basic Authentication\n     --ca-native                     Load CA certs from the OS\n     --cacert \u003cfile\u003e                 CA certificate to verify peer against\n     --capath \u003cdir\u003e                  CA directory to verify peer against\n -E, --cert \u003ccertificate[:password]\u003e  Client certificate file and password\n     --cert-status                   Verify server cert status OCSP-staple\n     --cert-type \u003ctype\u003e              Certificate type (DER/PEM/ENG/P12)\n     --ciphers \u003clist of ciphers\u003e     SSL ciphers to use\n     --compressed                    Request compressed response\n     --compressed-ssh                Enable SSH compression\n -K, --config \u003cfile\u003e                 Read config from a file\n     --connect-timeout \u003cseconds\u003e     Maximum time allowed to connect\n     --connect-to \u003cHOST1:PORT1:HOST2:PORT2\u003e  Connect to host\n -C, --continue-at \u003coffset\u003e          Resumed transfer offset\n -b, --cookie \u003cdata|filename\u003e        Send cookies from string/load from file\n -c, --cookie-jar \u003cfilename\u003e         Save cookies to \u003cfilename\u003e after operation\n     --create-dirs                   Create necessary local directory hierarchy\n     --create-file-mode \u003cmode\u003e       File mode for created files\n     --crlf                          Convert LF to CRLF in upload\n     --crlfile \u003cfile\u003e                Certificate Revocation list\n     --curves \u003clist\u003e                 (EC) TLS key exchange algorithms to request\n -d, --data \u003cdata\u003e                   HTTP POST data\n     --data-ascii \u003cdata\u003e             HTTP POST ASCII data\n     --data-binary \u003cdata\u003e            HTTP POST binary data\n     --data-raw \u003cdata\u003e               HTTP POST data, '@' allowed\n     --data-urlencode \u003cdata\u003e         HTTP POST data URL encoded\n     --delegation \u003cLEVEL\u003e            GSS-API delegation permission\n     --digest                        HTTP Digest Authentication\n -q, --disable                       Disable .curlrc\n     --disable-eprt                  Inhibit using EPRT or LPRT\n     --disable-epsv                  Inhibit using EPSV\n     --disallow-username-in-url      Disallow username in URL\n     --dns-interface \u003cinterface\u003e     Interface to use for DNS requests\n     --dns-ipv4-addr \u003caddress\u003e       IPv4 address to use for DNS requests\n     --dns-ipv6-addr \u003caddress\u003e       IPv6 address to use for DNS requests\n     --dns-servers \u003caddresses\u003e       DNS server addrs to use\n     --doh-cert-status               Verify DoH server cert status OCSP-staple\n     --doh-insecure                  Allow insecure DoH server connections\n     --doh-url \u003cURL\u003e                 Resolve hostnames over DoH\n -D, --dump-header \u003cfilename\u003e        Write the received headers to \u003cfilename\u003e\n     --egd-file \u003cfile\u003e               EGD socket path for random data\n     --engine \u003cname\u003e                 Crypto engine to use\n     --etag-compare \u003cfile\u003e           Load ETag from file\n     --etag-save \u003cfile\u003e              Parse incoming ETag and save to a file\n     --expect100-timeout \u003cseconds\u003e   How long to wait for 100-continue\n -f, --fail                          Fail fast with no output on HTTP errors\n     --fail-early                    Fail on first transfer error\n     --fail-with-body                Fail on HTTP errors but save the body\n     --false-start                   Enable TLS False Start\n -F, --form \u003cname=content\u003e           Specify multipart MIME data\n     --form-escape                   Escape form fields using backslash\n     --form-string \u003cname=string\u003e     Specify multipart MIME data\n     --ftp-account \u003cdata\u003e            Account data string\n     --ftp-alternative-to-user \u003ccommand\u003e  String to replace USER [name]\n     --ftp-create-dirs               Create the remote dirs if not present\n     --ftp-method \u003cmethod\u003e           Control CWD usage\n     --ftp-pasv                      Send PASV/EPSV instead of PORT\n -P, --ftp-port \u003caddress\u003e            Send PORT instead of PASV\n     --ftp-pret                      Send PRET before PASV\n     --ftp-skip-pasv-ip              Skip the IP address for PASV\n     --ftp-ssl-ccc                   Send CCC after authenticating\n     --ftp-ssl-ccc-mode \u003cactive/passive\u003e  Set CCC mode\n     --ftp-ssl-control               Require TLS for login, clear for transfer\n -G, --get                           Put the post data in the URL and use GET\n -g, --globoff                       Disable URL globbing with {} and []\n     --happy-eyeballs-timeout-ms \u003cms\u003e  Time for IPv6 before IPv4\n     --haproxy-clientip \u003cip\u003e         Set address in HAProxy PROXY\n     --haproxy-protocol              Send HAProxy PROXY protocol v1 header\n -I, --head                          Show document info only\n -H, --header \u003cheader/@file\u003e         Pass custom header(s) to server\n -h, --help \u003ccategory\u003e               Get help for commands\n     --hostpubmd5 \u003cmd5\u003e              Acceptable MD5 hash of host public key\n     --hostpubsha256 \u003csha256\u003e        Acceptable SHA256 hash of host public key\n     --hsts \u003cfilename\u003e               Enable HSTS with this cache file\n     --http0.9                       Allow HTTP 0.9 responses\n -0, --http1.0                       Use HTTP 1.0\n     --http1.1                       Use HTTP 1.1\n     --http2                         Use HTTP/2\n     --http2-prior-knowledge         Use HTTP 2 without HTTP/1.1 Upgrade\n     --http3                         Use HTTP v3\n     --http3-only                    Use HTTP v3 only\n     --ignore-content-length         Ignore the size of the remote resource\n -i, --include                       Include response headers in output\n -k, --insecure                      Allow insecure server connections\n     --interface \u003cname\u003e              Use network INTERFACE (or address)\n     --ipfs-gateway \u003cURL\u003e            Gateway for IPFS\n -4, --ipv4                          Resolve names to IPv4 addresses\n -6, --ipv6                          Resolve names to IPv6 addresses\n     --json \u003cdata\u003e                   HTTP POST JSON\n -j, --junk-session-cookies          Ignore session cookies read from file\n     --keepalive-time \u003cseconds\u003e      Interval time for keepalive probes\n     --key \u003ckey\u003e                     Private key filename\n     --key-type \u003ctype\u003e               Private key file type (DER/PEM/ENG)\n     --krb \u003clevel\u003e                   Enable Kerberos with security \u003clevel\u003e\n     --libcurl \u003cfile\u003e                Generate libcurl code for this command line\n     --limit-rate \u003cspeed\u003e            Limit transfer speed to RATE\n -l, --list-only                     List only mode\n     --local-port \u003crange\u003e            Use a local port number within RANGE\n -L, --location                      Follow redirects\n     --location-trusted            Like --location, but send auth to other hosts\n     --login-options \u003coptions\u003e       Server login options\n     --mail-auth \u003caddress\u003e           Originator address of the original email\n     --mail-from \u003caddress\u003e           Mail from this address\n     --mail-rcpt \u003caddress\u003e           Mail to this address\n     --mail-rcpt-allowfails          Allow RCPT TO command to fail\n -M, --manual                        Display the full manual\n     --max-filesize \u003cbytes\u003e          Maximum file size to download\n     --max-redirs \u003cnum\u003e              Maximum number of redirects allowed\n -m, --max-time \u003cseconds\u003e            Maximum time allowed for transfer\n     --metalink                      Process given URLs as metalink XML file\n     --negotiate                     Use HTTP Negotiate (SPNEGO) authentication\n -n, --netrc                         Must read .netrc for username and password\n     --netrc-file \u003cfilename\u003e         Specify FILE for netrc\n     --netrc-optional                Use either .netrc or URL\n -:, --next                        Make next URL use its separate set of options\n     --no-alpn                       Disable the ALPN TLS extension\n -N, --no-buffer                     Disable buffering of the output stream\n     --no-clobber                    Do not overwrite files that already exist\n     --no-keepalive                  Disable TCP keepalive on the connection\n     --no-npn                        Disable the NPN TLS extension\n     --no-progress-meter             Do not show the progress meter\n     --no-sessionid                  Disable SSL session-ID reusing\n     --noproxy \u003cno-proxy-list\u003e       List of hosts which do not use proxy\n     --ntlm                          HTTP NTLM authentication\n     --ntlm-wb                       HTTP NTLM authentication with winbind\n     --oauth2-bearer \u003ctoken\u003e         OAuth 2 Bearer Token\n -o, --output \u003cfile\u003e                 Write to file instead of stdout\n     --output-dir \u003cdir\u003e              Directory to save files in\n -Z, --parallel                      Perform transfers in parallel\n     --parallel-immediate         Do not wait for multiplexing (with --parallel)\n     --parallel-max \u003cnum\u003e            Maximum concurrency for parallel transfers\n     --pass \u003cphrase\u003e                 Pass phrase for the private key\n     --path-as-is                    Do not squash .. sequences in URL path\n     --pinnedpubkey \u003chashes\u003e       FILE/HASHES Public key to verify peer against\n     --post301                       Do not switch to GET after a 301 redirect\n     --post302                       Do not switch to GET after a 302 redirect\n     --post303                       Do not switch to GET after a 303 redirect\n     --preproxy [protocol://]host[:port]  Use this proxy first\n -#, --progress-bar                  Display transfer progress as a bar\n     --proto \u003cprotocols\u003e             Enable/disable PROTOCOLS\n     --proto-default \u003cprotocol\u003e      Use PROTOCOL for any URL missing a scheme\n     --proto-redir \u003cprotocols\u003e       Enable/disable PROTOCOLS on redirect\n -x, --proxy [protocol://]host[:port]  Use this proxy\n     --proxy-anyauth                 Pick any proxy authentication method\n     --proxy-basic                   Use Basic authentication on the proxy\n     --proxy-ca-native               Load CA certs from the OS to verify proxy\n     --proxy-cacert \u003cfile\u003e           CA certificates to verify proxy against\n     --proxy-capath \u003cdir\u003e            CA directory to verify proxy against\n     --proxy-cert \u003ccert[:passwd]\u003e    Set client certificate for proxy\n     --proxy-cert-type \u003ctype\u003e        Client certificate type for HTTPS proxy\n     --proxy-ciphers \u003clist\u003e          SSL ciphers to use for proxy\n     --proxy-crlfile \u003cfile\u003e          Set a CRL list for proxy\n     --proxy-digest                  Digest auth with the proxy\n     --proxy-header \u003cheader/@file\u003e   Pass custom header(s) to proxy\n     --proxy-http2                   Use HTTP/2 with HTTPS proxy\n     --proxy-insecure                Skip HTTPS proxy cert verification\n     --proxy-key \u003ckey\u003e               Private key for HTTPS proxy\n     --proxy-key-type \u003ctype\u003e         Private key file type for proxy\n     --proxy-negotiate               HTTP Negotiate (SPNEGO) auth with the proxy\n     --proxy-ntlm                    NTLM authentication with the proxy\n     --proxy-pass \u003cphrase\u003e       Pass phrase for the private key for HTTPS proxy\n     --proxy-pinnedpubkey \u003chashes\u003e   FILE/HASHES public key to verify proxy with\n     --proxy-service-name \u003cname\u003e     SPNEGO proxy service name\n     --proxy-ssl-allow-beast     Allow security flaw for interop for HTTPS proxy\n     --proxy-ssl-auto-client-cert    Auto client certificate for proxy\n     --proxy-tls13-ciphers \u003cciphersuite list\u003e  TLS 1.3 proxy cipher suites\n     --proxy-tlsauthtype \u003ctype\u003e      TLS authentication type for HTTPS proxy\n     --proxy-tlspassword \u003cstring\u003e    TLS password for HTTPS proxy\n     --proxy-tlsuser \u003cname\u003e          TLS username for HTTPS proxy\n     --proxy-tlsv1                   TLSv1 for HTTPS proxy\n -U, --proxy-user \u003cuser:password\u003e    Proxy user and password\n     --proxy1.0 \u003chost[:port]\u003e        Use HTTP/1.0 proxy on given port\n -p, --proxytunnel                   HTTP proxy tunnel (using CONNECT)\n     --pubkey \u003ckey\u003e                  SSH Public key filename\n -Q, --quote \u003ccommand\u003e               Send command(s) to server before transfer\n     --random-file \u003cfile\u003e            File for reading random data from\n -r, --range \u003crange\u003e                 Retrieve only the bytes within RANGE\n     --rate \u003cmax request rate\u003e       Request rate for serial transfers\n     --raw                           Do HTTP raw; no transfer decoding\n -e, --referer \u003cURL\u003e                 Referrer URL\n -J, --remote-header-name            Use the header-provided filename\n -O, --remote-name                   Write output to file named as remote file\n     --remote-name-all               Use the remote filename for all URLs\n -R, --remote-time                   Set remote file's time on local output\n     --remove-on-error               Remove output file on errors\n -X, --request \u003cmethod\u003e              Specify request method to use\n     --request-target \u003cpath\u003e         Specify the target for this request\n     --resolve \u003c[+]host:port:addr[,addr]...\u003e  Resolve host+port to address\n     --retry \u003cnum\u003e                   Retry request if transient problems occur\n     --retry-all-errors              Retry all errors (with --retry)\n     --retry-connrefused             Retry on connection refused (with --retry)\n     --retry-delay \u003cseconds\u003e         Wait time between retries\n     --retry-max-time \u003cseconds\u003e      Retry only within this period\n     --sasl-authzid \u003cidentity\u003e       Identity for SASL PLAIN authentication\n     --sasl-ir                       Initial response in SASL authentication\n     --service-name \u003cname\u003e           SPNEGO service name\n -S, --show-error                    Show error even when -s is used\n -s, --silent                        Silent mode\n     --socks4 \u003chost[:port]\u003e          SOCKS4 proxy on given host + port\n     --socks4a \u003chost[:port]\u003e         SOCKS4a proxy on given host + port\n     --socks5 \u003chost[:port]\u003e          SOCKS5 proxy on given host + port\n     --socks5-basic                  Username/password auth for SOCKS5 proxies\n     --socks5-gssapi                 Enable GSS-API auth for SOCKS5 proxies\n     --socks5-gssapi-nec             Compatibility with NEC SOCKS5 server\n     --socks5-gssapi-service \u003cname\u003e  SOCKS5 proxy service name for GSS-API\n     --socks5-hostname \u003chost[:port]\u003e  SOCKS5 proxy, pass hostname to proxy\n -Y, --speed-limit \u003cspeed\u003e           Stop transfers slower than this\n -y, --speed-time \u003cseconds\u003e          Trigger 'speed-limit' abort after this time\n     --ssl                           Try enabling TLS\n     --ssl-allow-beast               Allow security flaw to improve interop\n     --ssl-auto-client-cert          Use auto client certificate (Schannel)\n     --ssl-no-revoke                 Disable cert revocation checks (Schannel)\n     --ssl-reqd                      Require SSL/TLS\n     --ssl-revoke-best-effort        Ignore missing cert CRL dist points\n -2, --sslv2                         SSLv2\n -3, --sslv3                         SSLv3\n     --stderr \u003cfile\u003e                 Where to redirect stderr\n     --styled-output                 Enable styled output for HTTP headers\n     --suppress-connect-headers      Suppress proxy CONNECT response headers\n     --tcp-fastopen                  Use TCP Fast Open\n     --tcp-nodelay                   Set TCP_NODELAY\n -t, --telnet-option \u003copt=val\u003e       Set telnet option\n     --tftp-blksize \u003cvalue\u003e          Set TFTP BLKSIZE option\n     --tftp-no-options               Do not send any TFTP options\n -z, --time-cond \u003ctime\u003e              Transfer based on a time condition\n     --tls-max \u003cVERSION\u003e             Maximum allowed TLS version\n     --tls13-ciphers \u003clist\u003e          TLS 1.3 cipher suites to use\n     --tlsauthtype \u003ctype\u003e            TLS authentication type\n     --tlspassword \u003cstring\u003e          TLS password\n     --tlsuser \u003cname\u003e                TLS username\n -1, --tlsv1                         TLSv1.0 or greater\n     --tlsv1.0                       TLSv1.0 or greater\n     --tlsv1.1                       TLSv1.1 or greater\n     --tlsv1.2                       TLSv1.2 or greater\n     --tlsv1.3                       TLSv1.3 or greater\n     --tr-encoding                   Request compressed transfer encoding\n     --trace \u003cfile\u003e                  Write a debug trace to FILE\n     --trace-ascii \u003cfile\u003e            Like --trace, but without hex output\n     --trace-config \u003cstring\u003e         Details to log in trace/verbose output\n     --trace-ids                     Transfer + connection ids in verbose output\n     --trace-time                    Add time stamps to trace/verbose output\n     --unix-socket \u003cpath\u003e            Connect through this Unix domain socket\n -T, --upload-file \u003cfile\u003e            Transfer local FILE to destination\n     --url \u003curl\u003e                     URL to work with\n     --url-query \u003cdata\u003e              Add a URL query part\n -B, --use-ascii                     Use ASCII/text transfer\n -u, --user \u003cuser:password\u003e          Server user and password\n -A, --user-agent \u003cname\u003e             Send User-Agent \u003cname\u003e to server\n     --variable \u003c[%]name=text/@file\u003e  Set variable\n -v, --verbose                       Make the operation more talkative\n -V, --version                       Show version number and quit\n -w, --write-out \u003cformat\u003e            Output FORMAT after completion\n     --xattr                         Store metadata in extended file attributes\n```\n\nSimple GET:\n\n![](doc/get.png)\n\nCustom method, headers and JSON data:\n\n![](doc/put.png)\n\nWhen running interactively, `curli` automatically pretty-prints JSON output. To enforce pretty-printing in any mode, use the `--pretty` option.\n\n## Differences with httpie\n\n- Like `curl` but unlike `httpie`, headers are written on `stderr` instead of `stdout`.\n- Output is not buffered, all the formatting is done on the fly so you can easily debug streamed data.\n- Use the `--curl` option to print executed curl command.\n\n## 🤝 How to contribute\n\nWe welcome contributions!\n\n- Fork this repository;\n- Create a branch with your feature: `git checkout -b my-feature`;\n- Commit your changes: `git commit -m \"feat: my new feature\"`;\n- Push to your branch: `git push origin my-feature`.\n\nOnce your pull request has been merged, you can delete your branch.\n\n## 📝 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrinhminhtriet%2Fcurli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftrinhminhtriet%2Fcurli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrinhminhtriet%2Fcurli/lists"}