# Optional tools for Elixir applications Reviewed: 2026-10-06. Choose and configure each library against its installed-version documentation. Select an optional tool only when the application's requirements match its use case. Explain the selection, check compatibility with the project's lockfile, and follow its installed-version documentation. Do not install the whole menu. ## Accounts and product controls ### Social login and OIDC: Assent Use it when: Users need to sign in with Google, GitHub, Apple or an OpenID Connect provider. How it fits: Integrate provider authentication with the application's existing accounts and sessions. What else to account for: Account linking, session management and permissions remain application concerns. SAML is a separate requirement. Sources: [Assent](https://github.com/pow-auth/assent) ### Rate limiting: Hammer Use it when: Login attempts, API calls, uploads or expensive actions need limits. How it fits: Define limits by actor, operation and time window; choose a backend that matches the deployment. What else to account for: A node-local counter does not automatically enforce a cluster-wide quota. Choose the algorithm's burst behavior deliberately. Sources: [Hammer](https://hexdocs.pm/hammer/readme.html) ### Feature flags: FunWithFlags Use it when: Features need gradual rollout, per-customer access or an operational off switch. How it fits: Choose an Ecto or Redis persistence adapter and configure synchronization between nodes. What else to account for: Keep permission checks separate from rollout flags. Remove expired flags and restrict the management interface. Sources: [FunWithFlags](https://hexdocs.pm/fun_with_flags/readme.html) ## Files and documents ### Object storage: ExAws.S3 Use it when: Uploads need to live in an S3 or compatible object store. How it fits: Use ExAws with its S3 service module for object operations and signed URLs. In a LiveView app, connect it to the upload flow. What else to account for: The storage service, credentials, access rules and lifecycle policy are separate. Check which operations a compatible service actually supports. Sources: [ExAws.S3](https://hexdocs.pm/ex_aws_s3/ExAws.S3.html) ### Image processing: Image Use it when: The product needs thumbnails, resized uploads, image conversion or watermarks. How it fits: Process images through the libvips-backed Image API; use Oban for work that needs retries. What else to account for: Vix/libvips introduces native runtime requirements. Check the deployment target and required codecs, and limit input dimensions and processing work. Sources: [Image](https://hexdocs.pm/image/readme.html) ### PDF generation: ChromicPDF Use it when: Invoices, reports or other HTML documents need downloadable PDFs. How it fits: Render application-owned HTML and CSS through a managed Chrome process. What else to account for: Chrome is an additional runtime dependency; PDF/A conversion also uses Ghostscript. Isolate rendering and control access to external resources. Sources: [ChromicPDF](https://hexdocs.pm/chromic_pdf/ChromicPDF.html) ### CSV import and export: NimbleCSV Use it when: Users need bulk uploads, data exports or integrations through CSV files. How it fits: Parse and write streams; validate each imported row through the application's business rules. What else to account for: CSV parsing does not validate field types or business rules. Define malformed-row handling and spreadsheet formula escaping for exports. Sources: [NimbleCSV](https://hexdocs.pm/nimble_csv/NimbleCSV.html) ## APIs and collaboration ### Documented HTTP APIs: OpenApiSpex Use it when: External consumers need an OpenAPI contract for the Phoenix API. How it fits: Describe operations and schemas, validate requests, and test responses against the specification. What else to account for: A schema does not enforce ownership or authorization. Keep the published contract aligned with application behavior. Sources: [OpenApiSpex](https://hexdocs.pm/open_api_spex/readme.html) ### GraphQL APIs: Absinthe Use it when: Clients specifically need GraphQL queries, mutations or subscriptions. How it fits: Expose the existing business layer through a schema; use Dataloader where batching is needed. What else to account for: Resolvers still need authorization and query-cost limits. Ordinary JSON endpoints remain simpler when GraphQL adds no client benefit. Sources: [Absinthe](https://hexdocs.pm/absinthe/overview.html) ### Who is online: Phoenix Presence Use it when: Chat, collaborative screens or live rooms need connected-user state. How it fits: Track presence metadata and broadcast joins and leaves through Phoenix's existing realtime infrastructure. What else to account for: Presence is ephemeral and eventually consistent. It is not a durable audit trail, access-control system or editing-conflict resolver. Sources: [Phoenix Presence](https://hexdocs.pm/phoenix/Phoenix.Presence.html) ## Languages, locales and money ### Translated interface text: Gettext Use it when: The application needs interface copy in multiple languages. How it fits: Use the Gettext integration already present in typical Phoenix projects; maintain translation catalogs and plural forms. What else to account for: It does not translate user-authored content automatically. Dates, amounts and units need locale-aware formatting too. Sources: [Gettext](https://hexdocs.pm/gettext/Gettext.html) ### Localized dates and numbers: Localize Use it when: Dates, numbers, currencies and units must follow the user's locale. How it fits: Use CLDR-based formatting and parsing. For new projects, evaluate Localize as the documented successor to the ex_cldr family. What else to account for: Existing ex_cldr applications need a planned migration. Check runtime requirements and package locale data for deployment. Sources: [Localize](https://hexdocs.pm/localize/readme.html) ยท [ex_cldr migration notice](https://hexdocs.pm/ex_cldr/readme.html) ### Currency amounts: Money (ex_money) Use it when: Prices, invoices or balances need explicit currencies and decimal arithmetic. How it fits: Represent amount and currency together and make rounding rules explicit. What else to account for: This is not payment processing, tax calculation or an accounting ledger. The package is ex_money; check its major-version migration notes. Sources: [Money](https://hexdocs.pm/ex_money/readme.html) ## AI features ### Calling language models: ReqLLM Use it when: The product needs text generation, streamed responses or model tool calls through hosted APIs. How it fits: Use a common Elixir interface to supported model providers and keep provider-specific settings explicit. What else to account for: Provider capabilities differ. The client does not supply evaluation, permission checks or a reliable autonomous workflow; test the exact model and features used. Sources: [ReqLLM](https://github.com/agentjido/req_llm) ### Vector similarity search: pgvector Use it when: Embeddings are useful for semantic retrieval or recommendations alongside existing PostgreSQL data. How it fits: Enable the PostgreSQL vector extension and use the Elixir pgvector integration with Ecto or Postgrex. What else to account for: The library does not generate embeddings. Verify database-extension support, dimensions, indexes and retrieval quality against representative queries. Sources: [pgvector for Elixir](https://hexdocs.pm/pgvector/readme.html) ### Running pretrained models: Bumblebee + Nx Use it when: Inference should run on infrastructure you control, using a supported pretrained model. How it fits: Load supported model architectures with Bumblebee and serve predictions through Nx.Serving. What else to account for: Plan model memory, a suitable numerical backend and hardware. Model compatibility and licensing need to be checked individually. Sources: [Bumblebee](https://hexdocs.pm/bumblebee/Bumblebee.html) ## Data processing ### Message ingestion pipelines: Broadway Use it when: The application consumes a stream from Kafka, RabbitMQ, SQS or another supported source. How it fits: Build concurrent processing stages with batching, acknowledgements and back-pressure. What else to account for: The source connector determines delivery behavior. Keep handlers safe to retry; ordinary application jobs still fit Oban. Sources: [Broadway](https://hexdocs.pm/broadway/Broadway.html) ### Tabular data analysis: Explorer Use it when: Imports, analytics or reports need dataframe transformations over CSV, Parquet or similar datasets. How it fits: Use typed series and dataframes for grouping, joining and transforming tabular data. What else to account for: The default Polars backend uses native code. Check deployment support and memory use; routine application queries still belong in Ecto. Sources: [Explorer](https://hexdocs.pm/explorer/Explorer.html) ## A different application architecture ### Declarative business applications: Ash Use it when: Resources, actions, policies and derived APIs form a substantial part of the application. How it fits: Evaluate Ash early as the domain layer beneath Phoenix, with only the extensions the product needs. What else to account for: This changes how business logic is modeled. It is an architectural choice, not a small utility to install beside an unchanged contexts design. Sources: [What is Ash?](https://hexdocs.pm/ash/what-is-ash.html) ## Specialist projects These need their own architecture and deployment plan: - [Nerves](https://hexdocs.pm/nerves/getting-started.html): Embedded devices and firmware. - [Membrane](https://membrane.stream/): Audio, video and streaming pipelines.