Quick and Easy Favicons

Add all the favions you need with one icon.svg and this template. Inkscape and SVGO CLI tools required.
Icons/chart bar
Used 8 times
Created by
E Eelco from Rails Designer

Usage

Run this command in your Rails app directory in the terminal:

rails app:template LOCATION="https://railsbytes.com/script/zamsKD"
Template Source

Review the code before running this template on your machine.

APPLICATION_LAYOUT_PATH = Rails.root.join("app/views/layouts/application.html.erb")

def tool_installed?(tool)
  system("which #{tool} > /dev/null 2>&1")
end

abort "Inkscape is required to continue." unless tool_installed?("inkscape")
abort "SVGO is required to continue" unless tool_installed?("svgo")
abort "icon.svg is not present in the root folder" unless File.exist?("icon.svg")

app_name = ask("What is the name of your Rails app?") || "Unnamed"


say "Creating the favicon.ico"
run "inkscape ./icon.svg --export-width=32 --export-filename='./tmp.png'"
run "convert ./tmp.png ./public/favicon.ico"
run "rm ./tmp.png"


say "Creating the PNG files"
run "inkscape ./icon.svg --export-width=512 --export-filename='./public/icon-512.png'"
run "inkscape ./icon.svg --export-width=192 --export-filename='./public/icon-192.png'"
run "inkscape ./icon.svg --export-width=180 --export-filename='./public/apple-touch-icon.png'"


say "Optimizing the SVG file"
run "npx svgo --multipass icon.svg"


say "Create additional files"
create_file "public/manifest.webmanifest", <<~JSON
{
  "name": "#{app_name}",
  "icons": [
    { "src": "/icon-192.png", "type": "image/png", "sizes": "192x192" },
    { "src": "/icon-512.png", "type": "image/png", "sizes": "512x512" }
  ]
}
JSON

create_file "app/views/shared/_favicons.html.erb", <<~ERB
<link rel="icon" href="/favicon.ico" sizes="32x32">
<link rel="icon" href="/icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="manifest" href="/manifest.webmanifest">
ERB


say "Moving the source icon.svg to the /public/ folder"
run "mv icon.svg public/"


say "Inserting the favicons partial with the application's layout <head>"
if APPLICATION_LAYOUT_PATH.exist?
  application_content = File.read(APPLICATION_LAYOUT_PATH)

  if File.open(APPLICATION_LAYOUT_PATH).read =~ /<\/head>/
    insert_into_file APPLICATION_LAYOUT_PATH.to_s, <<~ERB.indent(2), before: /^\s*<\/head>/
      <%= render partial: "shared/favicons" %>
    ERB
  else
    say "The <head> tag is missing in your application layout", :red
      say %(        Add <%= render partial: "shared/favicons" %> within the <head> of your layout.)
  end
else
  say "Default application.html.erb is missing!", :red
  say %(        Add <%= render partial: "shared/favicons" %> within the <head> of your layout.)
end

say "All done! ✨", :green

# Needed so `bundle install` does not run
def run_bundle ; end
Comments
Eelco from Rails Designer
See all the manual steps outlined here: https://railsdesigner.com/favicons-in-rails/
Eelco from Rails Designer
See all the manual steps outlined here: https://railsdesigner.com/favicons-in-rails/