Setup Middleman
This how-to provides a comprehensive guide to setting up a clean, optimized Middleman project from the ground up. It focuses on best practices for both development and production environments, helping developers maintain a well-organized, performant static site.
Prerequisites
- Ruby installed
Target Folder Structure
my_project/
├── source/
│ ├── assets/ ← Assets here
│ │ ├── css/
│ │ ├── img/
│ │ └── js/
│ ├── index.html.slim
│ └── layouts/
│ └── layout.slim
├── .gitignore
├── Gemfile
└── config.rb
Neat Foundation
First of all, we're going to create the foundation for the Sinatra application:
| File | Folder | Description |
|---|---|---|
| Gemfile | / | App's gem dependencies definition |
Gemfile creation
Gemfile creation with this command line:
echo "source \"https://rubygems.org\"\n git_source(:github) { |repo| \"https://github.com/#{repo}.git#\" }" > Gemfile
Add Gems
Install the Gems needed to run the application:
bundle add builder middleman middleman-autoprefixer middleman-blog middleman-minify-html nokogiri redcarpet slim terser
Root Files Optimization
.gitignore File
Use your terminal:
A .gitignore file is created to exclude temporary, OS-specific, and development tool files from version control (e.g., .DS_Store, .idea/, .vscode/, build/). This ensures the Git repository remains clean and focused only on the essential project files, reducing clutter and potential merge conflicts.
config.rb File
Use your terminal:
This central Middleman configuration file defines how the project behaves during development and build:
- Autoprefixer: Automatically adds vendor prefixes to CSS, ensuring compatibility across the latest 2 versions of major browsers.
- Layout Settings: Disables layout rendering for certain file types like XML, JSON, and plain text to streamline output.
- Asset Paths: Custom directories (
assets/css,assets/js,assets/img) are specified for better organization. - Build Optimizations: Enables minification for HTML, CSS, and JavaScript (using Terser) and Gzip compression, significantly reducing file sizes for faster load times in production.
# config.rb
# Activate and configure extensions
# https://middlemanapp.com/advanced/configuration/#configuring-extensions
activate :autoprefixer do |prefix|
prefix.browsers = "last 2 versions"
end
# Layouts
# https://middlemanapp.com/basics/layouts/
# Per-page layout changes
page '/*.xml', layout: false
page '/*.xsl', layout: false
page '/*.json', layout: false
page '/*.txt', layout: false
# Assets
set :css_dir, 'assets/css'
set :images_dir, 'assets/img'
set :js_dir, 'assets/js'
# Proxy pages
# https://middlemanapp.com/advanced/dynamic-pages/
# proxy(
# '/this-page-has-no-template.html',
# '/template-file.html',
# locals: {
# which_fake_page: 'Rendering a fake page with a local variable'
# },
# )
# Helpers
# Methods defined in the helpers block are available in templates
# https://middlemanapp.com/basics/helper-methods/
# helpers do
# def some_helper
# 'Helping'
# end
# end
# Build-specific configuration
# https://middlemanapp.com/advanced/configuration/#environment-specific-settings
configure :build do
# activate: minify_html
activate :minify_html
# activate: minify_css
activate :minify_css
# activate: minify_javascript, compressor: Terser.new
activate :minify_javascript, compressor: Terser.new
# Gzip
activate :gzip
end
source Folders Content Creation
source/assets & source/layouts Folders
assets/ contains CSS, JavaScript, and images. This structure is designed to scale and supports SCSS preprocessing for cleaner, more powerful styles.
source/layouts/layout.slim File
Use your terminal:
layouts/ includes a default Slim-based HTML layout using Middleman's helper tags for automatic CSS and JS linking.
doctype html
html
head
meta charset="utf-8"
meta http-equiv="x-ua-compatible" content="ie=edge"
meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"
title = current_page.data.title || "Middleman"
= stylesheet_link_tag "site"
= javascript_include_tag "site"
body
== yield
source/assets/css/site.css.scss File
Use your terminal:
Copy & paste:
body {
background-color: #fbc547;
color: #333;
font-family: -apple-system, BlinkMacSystemFont, "Avenir Next", "Avenir",
"Segoe UI", "Lucida Grande", "Helvetica Neue", "Helvetica", "Fira Sans",
"Roboto", "Noto", "Droid Sans", "Cantarell", "Oxygen", "Ubuntu",
"Franklin Gothic Medium", "Century Gothic", "Liberation Sans", sans-serif;
padding: 18vh 1rem;
text-align: center;
}
a {
color: rgba(#000, 0.7);
&:focus,
&:hover {
color: rgba(#000, 0.6);
}
}
.middleman-logo {
margin-bottom: 1rem;
width: 10rem;
}
source/assets/img/.keep File
.keep file: Added to version control empty directories (like img/) when no assets exist yet — a common convention to ensure directory presence in Git.
source/assets/js/site.js File
Use your terminal:
Copy & paste:
source/index.html.slim File
Use your terminal:
index.html.slim demonstrates a functional landing page with inline SVG and dynamic title rendering from frontmatter, a common Middleman feature.
---
title: Welcome to Middleman
---
svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 340" class="middleman-logo" aria-labelledby="middleman-logo__title" role="img"
title id="middleman-logo__title"
path class="middleman-logo__top-left-bar" fill-opacity=".45" d="M0 40L200 0v30L0 60z"
path class="middleman-logo__top-right-bar" fill="#fff" d="M200 0l200 40v20L200 30z"
path class="middleman-logo__left-m" fill-opacity=".45" d="M0 78v184l45 5V152l45 83 47-83v129l53 7V52l-57 8-43 83-43-70z"
path class="middleman-logo__right-m" fill="#fff" d="M400 78v184l-45 5V152l-45 83-47-83v129l-53 7V52l57 8 43 83 43-70z"
path class="middleman-logo__bottom-left-bar" fill-opacity=".45" d="M0 300l200 40v-30L0 280z"
path class="middleman-logo__bottom-right-bar" fill="#fff" d="M200 340l200-40v-20l-200 30z"
h1 Middleman is Running
= link_to("Read Documentation", "https://middlemanapp.com/basics/templating_language/", target: "_blank")
This setup serves as a lightweight yet robust Middleman boilerplate, ideal for developers who want:
- A clean Git history
- Pre-configured production optimizations
- A scalable project file layout
- Easy customization using Slim and SCSS
Perfect for static site generators, documentation portals, or quick prototyping environments.
Build and Deploy
Running one command, bundle exec middleman build, exports the site in a production-ready format. Choose from open source deployment solutions to get your site live.