Need help with torch?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

759 Stars 65 Forks Other 401 Commits 14 Opened issues


A rapid admin generator for Elixir & Phoenix

Services available


Need anything else?

Contributors list

License Build Status Coverage Status


Torch is a rapid admin generator for Phoenix applications. It creates custom templates and relies on the Phoenix HTML generator under the hood.



To install Torch, perform the following steps:

  1. Add
    to your list of dependencies in
    . Then, run
    mix deps.get
def deps do
    {:torch, "~> 3.6"}
  1. Add a
    plug to your
  at: "/torch",
  from: {:torch, "priv/static"},
  gzip: true,
  cache_control_for_etags: "public, max-age=86400"
  1. Configure Torch by adding the following to your
config :torch,
  otp_app: :my_app_name,
  template_format: "eex" || "slime"
  1. Run
    mix torch.install

NOTE: You can also choose to use

templates, but you will need to first install Phoenix Slime and then update your configuration to specify
template_format: "slime"

Now you're ready to start generating your admin! :tada:


Torch uses Phoenix generators under the hood. Torch injects it's own custom templates into your

directory, then runs the
mix phx.gen.html
task with the options you passed in. Finally, it uninstalls the custom templates so they don't interfere with running the plain Phoenix generators.

In light of that fact, the

task takes all the same arguments as the
, but does some extra configuration on either end. Checkout
mix help phx.gen.html
for more details about the supported options and format.

For example, if we wanted to generate a blog with a

model we could run the following command:
$ mix torch.gen.html Blog Post posts title:string body:text published_at:datetime published:boolean views:integer

The output would look like:

Add the resource to your browser scope in lib/my_app_web/router.ex:

resources "/posts", PostController

Ensure the following is added to your endpoint.ex:

  at: "/torch",
  from: {:torch, "priv/static"},
  gzip: true,
  cache_control_for_etags: "public, max-age=86400",
  headers: [{"access-control-allow-origin", "*"}]

:fire: Torch generated html for Posts! :fire:

Torch also installed an admin layout into your

. You will want to update it to include your new navigation link:

There may be times when you are adding Torch into an already existing system where your application already contains the modules and controllers and you just want to use the Torch admin interface. Since the

mix tasks are just wrappers around the existing
tasks, you can use most of the same flags. To add an admin interface for
in the previous example, where the model and controller modules already exist, use the following command:
$ mix torch.gen.html Blog Post posts --no-schema --no-context --web Admin title:string body:text published_at:datetime published:boolean views:integer

Association filters

Torch does not support association filters at this time. Filtrex does not yet support them.

You can checkout these two issues to see the latest updates:

However, that does not mean you can't roll your own.


We have a

model that
has_many :credentials, Accounts.Credential
and we want to support filtering users by
  1. Update the
# accounts.ex
defp do_paginate_users(filter, params) do
  credential_params = Map.get(params, "credentials")
  params = Map.drop(params, ["credentials"])

User |> Filtrex.query(filter) |> credential_filters(credential_params) |> order_by(^sort(params)) |> paginate(Repo, params, @pagination) end

defp credential_filters(query, nil), do: query

defp credential_filters(query, params) do search_string = "%#{params["email"]}%"

from(u in query, join: c in assoc(u, :credentials), where: like(, ^search_string), group_by: ) end ...

  1. Update form filters.
# users/index.html.eex

Note: You'll need to install & import

into your views
{:maybe, "~> 1.0.0"}
for the above
to work.


Torch generates two CSS themes you can use:

. The base styles are basically bare bones, and the theme styles look like the screenshot above. Just change the stylesheet link in the

If you want to use the theme, but override the colors, you'll need to include your own stylesheet with the specific overrides.


Torch comes with

files for several locales. If you are using Torch and can provide us with translation files for other languages, please submit a Pull Request with the translation file. We'd love to add as many translations as possible.

If you wish to add your own customized translations, you can configure Torch to use your own custom

and adding it in your Torch configuration settings in
. You can find the all messages that can be customized in the default i18n/backend.ex file.

If you are customizing a backend for a "standard" spoken language, please submit back a proper

translation file for us to include in the official Torch releases so other users can take advantage.


defmodule MyApp.CustomMessagesBackend do
  def message("Contains"), do: "** CUSTOM Contains **"
  def message("Equals"), do: "** CUSTOM Equals ****"
  def message("< Prev"), do: ""), do: "-->"

You can add a fallback so it won't break with newly added messages or

messages you did not customize

def message(text), do: Torch.I18n.Backend.message(text) end

# config.exs
config :torch,
  otp_app: :my_app_name,
  i18n_backend: MyApp.CustomMessagesBackend
  template_format: "eex" || "slime"

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.