wojtekmach

wojtekmach/req

Elixir Apache-2.0

Req is a batteries-included HTTP client for Elixir.

1.3k stars
166 forks
recent
GitHub

1.3k

Stars

166

Forks

60

Open issues

5

Contributors

v0.6.1 08 Jun 2026

AI Analysis

Req is a comprehensive HTTP client library for Elixir that provides automatic response decoding, redirect handling, retry logic, and extensive customization through a composable step-based architecture. It's ideal for developers building Elixir applications that need robust HTTP communication with minimal boilerplate. The library benefits anyone working with REST APIs or HTTP services in the Elixir ecosystem.

Documentation 9/10
Activity 8/10
Community 7/10
Code quality 8/10

Inferred from signals mentioned in the README (tests, CI, type safety) — not a review of the actual code.

Overall score 8/10

AI's overall editorial judgment — not an average of the bars above, can weigh other factors too.

http-client elixir networking batteries-included composable
Actively maintained Well documented Popular Community favorite Beginner friendly Production ready
Deep Analysis · Based on README and public signals
1w ago

Elixir HTTP client with batteries included, built on composable steps and plugin architecture

Req is a modern HTTP client library for Elixir that emphasizes developer ergonomics through a step-based architecture. It provides high-level convenience (automatic decompression, retry logic, authentication) while remaining fully extensible. Built primarily by Wojtek Mach, it appears to serve Elixir developers who want sensible defaults without sacrificing control. Adoption appears concentrated within the Elixir ecosystem; real-world scale is not well documented.

Origin

Req was created in March 2021 as an alternative to existing Elixir HTTP clients. It emerged during a period when the Elixir ecosystem was consolidating around Finch (the low-level HTTP adapter) and seeking higher-level abstractions. The project represents an attempt to create a cohesive, feature-complete HTTP client comparable to libraries in other languages.

Growth

Req gained approximately 1,316 stars over ~5 years, averaging modest growth. It sits between HTTPoison (2,296 stars, older, more established) and Finch (1,358 stars, lower-level). The 1 star gained in the last 7 days (as of June 2026) suggests growth has plateaued or stabilized. README documents a mature feature set and plugin ecosystem (req_easyhtml, req_s3, req_hex, req_github_oauth), indicating some community adoption, though scale is unclear.

In production

Adoption not verified. README demonstrates example usage but does not cite deployed production systems, user organizations, or scale metrics. The existence of at least 4 community plugins (req_easyhtml, req_s3, req_hex, req_github_oauth) suggests some real-world usage, but quantity of deployments is undocumented. GitHub star count (1,316) is modest relative to HTTPoison (2,296) and below Finch (1,358), suggesting narrower adoption than some alternatives.

Code analysis
Architecture

Based on README, Req uses a step-based pipeline architecture where requests flow through composable request, response, and error steps. This appears inspired by middleware patterns seen in web frameworks. The adapter layer (defaulting to Finch) allows pluggable HTTP backends. Core steps documented include compression, encoding, authentication, redirect handling, retry logic, and caching. Actual implementation complexity and performance characteristics cannot be verified from README alone.

Tests

README mentions `Req.Test` for creating test stubs and references CI/CD badges, suggesting automated testing is practiced. Specific test coverage percentages not documented in README.

Maintenance

Last push was 2026-06-10 (20 days before analysis date), indicating recent activity. Project is 5 years old. The Apache-2.0 license and active CI pipeline visible in README badges suggest ongoing maintenance. Frequency of maintenance cannot be precisely determined from metadata alone, but recent commits indicate the project is not abandoned.

Honest verdict

ADOPT IF: You are building HTTP-dependent Elixir applications and value a cohesive, well-documented API with sensible defaults, built-in retry/redirect/auth logic, and a plugin ecosystem. The step architecture allows customization without forking. AVOID IF: You need proven, extensively documented real-world production usage metrics; adoption is not well-publicized. Also avoid if you require the lowest possible overhead or prefer minimalist libraries over batteries-included design. MONITOR IF: You are evaluating Elixir HTTP clients and want to track whether Req gains broader adoption over HTTPoison/Finch; current evidence suggests it has found a stable niche but mainstream dominance is not evident.

Independent dimensions

Mainstream potential

4/10

Technical importance

6/10

Adoption evidence

3/10

Risks
  • Adoption not well-documented: No public case studies, deployment metrics, or production user testimonials identified. Scale relative to HTTPoison and Finch remains unclear.
  • Single maintainer visibility: Repository associated with Wojtek Mach; limited evidence of multi-maintainer model. Long-term sustainability depends on continued engagement.
  • Plugin ecosystem size appears modest: Four named plugins visible in README, suggesting ecosystem is young. Network effects may be limited compared to more established clients.
  • Competitive position uncertain: Sits between low-level (Finch) and legacy (HTTPoison) with similar star counts to both. May struggle to achieve dominant mindshare if developers fragment across all three.
  • Real-world validation gaps: No documented performance benchmarks, error handling analysis in production conditions, or comparison with competitors on latency/reliability.
Prediction

Req is likely to remain a stable, actively maintained niche choice within the Elixir ecosystem, appealing to developers who value batteries-included ergonomics and extensibility. It will probably not achieve dominant market share relative to HTTPoison or Finch, but may continue to grow slowly via adoption by new Elixir projects and through its plugin ecosystem. The step architecture positions it well for long-term evolution.

0 found this helpful

Newsletter

Get analyses like this every Monday

Free weekly digest of the most interesting open-source discoveries.

Languages

Elixir
100%

Information

Language
Elixir
License
Apache-2.0
Last updated
4w ago
Created
64mo ago
Analyzed with
anthropic/claude-haiku-4-5

Stars over time

Loading…

Contributors over time

Top 100 contributors only — repos with more will plateau at 100.

Loading…

Similar repos

akira

akira/exq

Exq is a job processing library for Elixir that uses Redis as a backend and is...

1.5k Elixir
ex-aws

ex-aws/ex_aws

ExAws is a flexible Elixir client library for AWS APIs that modularizes...

1.3k Elixir
edgurgel

edgurgel/httpoison

HTTPoison is an HTTP client library for Elixir that wraps the hackney HTTP...

2.3k Elixir Dev Tools
sneako

sneako/finch

Finch is a high-performance HTTP client for Elixir built on Mint and...

1.4k Elixir
elixir-ecto

elixir-ecto/ecto

Ecto is a data mapping and language-integrated query toolkit for Elixir,...

6.5k Elixir Dev Tools
vs. alternatives
HTTPoison

Older, more established (2,296 stars). HTTPoison is simpler but offers fewer batteries. Req appears positioned as a modernized, more feature-rich successor with better defaults, though both libraries coexist.

Finch

Lower-level HTTP adapter; Req actually uses Finch as default backend. Finch is about connection pooling and HTTP mechanics; Req adds convenience layers. They serve different abstraction levels, not direct substitutes.

httpc (Erlang stdlib)

Built-in Erlang HTTP client. Req offers far better ergonomics but requires additional dependency. Choice depends on whether batteries-included convenience justifies the dependency.

ex-aws

AWS-specific SDK (1,336 stars). Req includes AWS V4 Signature step, positioning it as capable of AWS interactions but more general-purpose than ex-aws.

Mint

Functional HTTP client mentioned in README docs. More low-level and minimal than Req; users typically layer abstractions on top. Req is higher-level and more prescriptive.