// the find
stavro/arc
:paperclip: Flexible file upload and attachment library for Elixir
Arc is a file upload library for Elixir that handles storing files to S3 or local disk, with optional ImageMagick/FFmpeg transformations and Ecto integration. It's been deprecated in favor of Waffle, which is a fork with the same API. If you're starting a new Elixir project, you should use Waffle instead — Arc is a dead end.
The definition module pattern is clean: you define uploads as first-class modules with versioning, validation, and storage config co-located. Async multi-version processing via Tasks is a reasonable default. ExAws integration means you get instance role credentials and the full AWS ecosystem without reinventing it. The scope pattern (attaching files to a record) maps naturally to how most web apps actually use uploads.
Deprecated — the README says so in the first line, and the last push was mid-2024 with no activity since. Validation is extension-only; there's no content-type sniffing or magic-byte checking, so a renamed executable with a .jpg extension gets stored. The transform API shells out to system executables, which means your deployment must have ImageMagick or FFmpeg installed — that's a runtime dependency that doesn't show up in mix.exs. No built-in support for GCS, Azure, or anything beyond S3/local without a third-party package, several of which appear unmaintained.