{"id":46445562,"url":"https://github.com/edlontech/quiver","last_synced_at":"2026-03-10T02:00:58.452Z","repository":{"id":341851492,"uuid":"1171654730","full_name":"edlontech/quiver","owner":"edlontech","description":"A pretty neat Elixir HTTP Client","archived":false,"fork":false,"pushed_at":"2026-03-07T17:38:27.000Z","size":81225,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-09T03:57:39.349Z","etag":null,"topics":["elixir","http-client"],"latest_commit_sha":null,"homepage":"","language":"Elixir","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/edlontech.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-03T13:18:03.000Z","updated_at":"2026-03-08T17:21:12.000Z","dependencies_parsed_at":"2026-03-09T01:00:40.516Z","dependency_job_id":null,"html_url":"https://github.com/edlontech/quiver","commit_stats":null,"previous_names":["edlontech/quiver"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/edlontech/quiver","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edlontech%2Fquiver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edlontech%2Fquiver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edlontech%2Fquiver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edlontech%2Fquiver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/edlontech","download_url":"https://codeload.github.com/edlontech/quiver/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edlontech%2Fquiver/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30304184,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-09T14:33:48.460Z","status":"ssl_error","status_checked_at":"2026-03-09T14:33:48.027Z","response_time":61,"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":["elixir","http-client"],"created_at":"2026-03-05T22:37:59.906Z","updated_at":"2026-03-10T02:00:58.395Z","avatar_url":"https://github.com/edlontech.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Quiver\n\nA fast, resilient HTTP client for Elixir with built-in connection pooling,\nHTTP/2 multiplexing, and streaming support.\n\n\n## Features\n\n- **HTTP/1.1 and HTTP/2** -- automatic protocol handling with TLS+ALPN\n- **Connection pooling** -- NimblePool for HTTP/1, GenStateMachine coordinator for HTTP/2\n- **Streaming responses** -- lazy body streams for large payloads and SSE\n- **Origin-based routing** -- exact, wildcard, and default pool rules per origin\n- **Structured errors** -- three error classes (transient, invalid, unrecoverable)\n- **Telemetry** -- request spans, connection lifecycle, and pool queue depth events\n- **Supervised** -- pools start lazily and live under your application's supervision tree\n\n## Installation\n\nAdd `quiver` to your dependencies in `mix.exs`:\n\n```elixir\ndef deps do\n  [\n    {:quiver, \"~\u003e 0.1.0\"}\n  ]\nend\n```\n\n## Quick Start\n\nAdd Quiver to your supervision tree:\n\n```elixir\nchildren = [\n  {Quiver.Supervisor, pools: %{default: [size: 10]}}\n]\n\nSupervisor.start_link(children, strategy: :one_for_one)\n```\n\nMake requests -- no need to pass a name, Quiver uses `Quiver.Pool` by default:\n\n```elixir\n# GET request\n{:ok, %Quiver.Response{status: 200, body: body}} =\n  Quiver.new(:get, \"https://httpbin.org/get\")\n  |\u003e Quiver.request()\n\n# POST with headers and body\n{:ok, %Quiver.Response{status: 200}} =\n  Quiver.new(:post, \"https://httpbin.org/post\")\n  |\u003e Quiver.header(\"content-type\", \"application/json\")\n  |\u003e Quiver.body(~s({\"key\": \"value\"}))\n  |\u003e Quiver.request()\n```\n\nStream large responses:\n\n```elixir\n{:ok, %Quiver.StreamResponse{status: 200, body: body_stream}} =\n  Quiver.new(:get, \"https://httpbin.org/stream/100\")\n  |\u003e Quiver.stream_request()\n\nbody_stream\n|\u003e Stream.each(\u0026IO.write/1)\n|\u003e Stream.run()\n```\n\n### Custom supervisor name\n\nIf you need multiple Quiver instances, pass a `:name` option:\n\n```elixir\n# Supervision tree\nchildren = [\n  {Quiver.Supervisor, name: :internal_client, pools: %{default: [size: 20]}},\n  {Quiver.Supervisor, name: :external_client, pools: %{default: [size: 5]}}\n]\n\n# Requests\nQuiver.new(:get, \"https://internal.api/data\")\n|\u003e Quiver.request(name: :internal_client)\n```\n\n## Pool Configuration\n\nRoute origins to pools with different settings:\n\n```elixir\npools = %{\n  \"https://api.example.com\" =\u003e [size: 50],\n  \"https://*.internal.io\"   =\u003e [size: 20],\n  default:                     [size: 5]\n}\n\n{Quiver.Supervisor, pools: pools}\n```\n\nRules match by specificity: exact \u003e wildcard \u003e default.\n\nBy default, Quiver auto-detects the HTTP protocol via TLS ALPN negotiation.\nTo force a specific protocol per origin:\n\n```elixir\npools = %{\n  \"https://http2-only.example.com\" =\u003e [size: 10, protocol: :http2],\n  \"https://legacy.example.com\"     =\u003e [size: 10, protocol: :http1],\n  default:                            [size: 5]\n}\n```\n\n## Tesla Integration\n\nQuiver ships with an optional [Tesla](https://github.com/elixir-tesla/tesla) adapter.\nAdd `tesla` to your dependencies and configure your client:\n\n```elixir\ndefmodule MyClient do\n  use Tesla\n\n  plug Tesla.Middleware.BaseUrl, \"https://api.example.com\"\n  plug Tesla.Middleware.JSON\n\n  adapter Tesla.Adapter.Quiver\nend\n```\n\nAll requests go through the default `Quiver.Pool` supervisor. To target a\ncustom supervisor, pass it as an adapter option:\n\n```elixir\nadapter Tesla.Adapter.Quiver, name: :my_quiver\n```\n\nAdapter-level options like streaming and timeouts can also be passed\nper-request:\n\n```elixir\nMyClient.get(\"/large-file\", opts: [adapter: [response: :stream]])\nMyClient.get(\"/slow\", opts: [adapter: [receive_timeout: 60_000]])\n```\n\nSee `Tesla.Adapter.Quiver` docs for all available options.\n\n## Documentation\n\n- [Getting Started](guides/getting-started.md)\n- [Architecture](guides/architecture.md)\n- [Error Handling](guides/error-handling.md)\n- [Telemetry](guides/telemetry.md)\n\nFull API documentation is available on [HexDocs](https://hexdocs.pm/quiver).\n\n## License\n\nMIT -- see [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedlontech%2Fquiver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fedlontech%2Fquiver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedlontech%2Fquiver/lists"}