CDN Assets Manager for Elixir
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

Elixir CDN Assets Manager

Build Status version

Content Delivery Network Package for Elixir/Phoenix.

This package provides the developer the ability to upload assets to a CDN with single mix command.
Inspired by Vinelab/cdn.



If available in Hex, the package can be installed as:

  1. Add cdn to your list of dependencies in mix.exs:
{:cdn, "~> 0.1.0"}


Firstly this package is relies on ex_aws then setting ex_aws before configuration.

:ex_aws must always be added to your applications list.

def application do
  [applications: [:ex_aws, :httpoison, :poison]]

Export your AWS access key ID and Secret to your environmet variable(recommend)

export AWS_ACCESS_KEY_ID=your_access_key_id
export AWS_SECRET_ACCESS_KEY=your_secret_access_key

or set config in mix.exs.

config :ex_aws,
  access_key_id: [{:system, "AWS_ACCESS_KEY_ID"}, :instance_role],
  secret_access_key: [{:system, "AWS_SECRET_ACCESS_KEY"}, :instance_role]

and set your region.

config :ex_aws,
  region: "us-east-1"

After that Configure :cdn in config.exs.(Example)

config :cdn,  bucket: "",
              include: [
                directories: ["priv/static", "public/bin"],
                patterns: ["**/*", "**/*.css"],
                hidden: true
              exclude: [
                directories: [],
                patterns: [],
                hidden: true
              acl: :public_read,
              cache_control: "max-age=#{86400 * 30}",
              expires_after: 86400 * 30,
              cloudfront_url: "",
              bypass: false

This means it should be include files matched pattern **/* or **/*.css in priv/static or public/bin. Also includes hidden files(filename starts with .). And base url for asset helper is, but always outputs local file url for asset helper because bypass is false.

  • bucket: A bucket name of s3
  • include: Setting for upload target
    • directories: List of upload directory(default: ["priv/static"])
    • patterns: List of upload pattern(default: ["**/*"])
    • hidden: Include hidden files or not
  • exclude: Exclude targets
  • acl: Default acl for assets
  • cloudfront_url: URL of CDN endopoint (e.g.
  • bypass: Return local asset if bypass is true in cdn helper.



  • Upload to S3
mix cdn.push
  • Empty bucket
mix cdn.empty

Asset Helper

Import CDN Helper to your dependency

  • Phoenix


def view do
  quote do
    # Import CDN helper
    import Cdn.Helpers

then you can load static file like this.

<%= cdn(static_path(@conn, "/css/app.css")) %>

# MIX_ENV=dev
<%= cdn(static_path(@conn, "/css/app.css")) %> #=> "/css/app.css"

# MIX_ENV=prod
<%= cdn(static_path(@conn, "/css/app.css")) %> #=> ""


  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request