easy-jekyll is an Emacs major mode for managing Jekyll blogs, giving you commands to create, preview, publish, and deploy posts without leaving the editor.
What is easy-jekyll?
easy-jekyll is an Emacs major mode that wraps the Jekyll static site generator into a dedicated buffer-based workflow. It takes a local Jekyll project directory as input and produces new posts with front matter, locally previewed sites, and published deployments to servers or static hosting services. The package requires Emacs 25.1 or higher and Jekyll 3.5.1 or higher, and is installed from MELPA with M-x package-install easy-jekyll.
Key Features
- New post creation —
M-x easy-jekyll-newpostprompts for a filename; ending in.mdgenerates a Markdown file and ending in.textilegenerates a Textile file, both with automatic front matter. - Multiple blog support — Set
easy-jekyll-bloglistto define any number of Jekyll blogs with independent settings, then switch between them using the<and>keys in easy-jekyll-mode. - Local preview —
M-x easy-jekyll-previewruns Jekyll and opens the site in your browser; repeating the command reuses the same Jekyll process, and the process auto-terminates after 300 seconds by default. - Multi-platform deployment — Deploy to your own server with
easy-jekyll-publish(via rsync), to Amazon S3 witheasy-jekyll-amazon-s3-deploy, to Google Cloud Storage witheasy-jekyll-google-cloud-storage-deploy, to GitHub Pages via an executabledeploy.shwitheasy-jekyll-github-deploy, or to Firebase witheasy-jekyll-firebase-deploy. - Clever publish —
M-x easy-jekyll-publish-cleverinspects the current blog's configuration and automatically runs the matching deploy command, so you can press one key regardless of target. - Integrated search —
M-x easy-jekyll-agsearches your posts using consult-ripgrep, counsel-ag, or helm-ag (in that priority order), with the option to force helm-ag or counsel-ag viaeasy-jekyll-helm-agandeasy-jekyll-counsel-ag. - Image helpers —
easy-jekyll-imageinserts a Markdown image link from the configured image directory (default "images");easy-jekyll-put-imagemoves a local picture into that directory and links it;easy-jekyll-pull-imagedownloads an image from a copied URL and inserts the link. - Magit integration — Pressing
Min easy-jekyll-mode opens Magit for the blog repository, letting you commit and push changes without switching buffers.
Who is it for?
- Emacs-using Jekyll bloggers — write drafts in Markdown or Textile, preview locally, and publish with single-key commands from the mode buffer.
- Developers managing several blogs — use
easy-jekyll-bloglistto keep per-blog configuration for servers, domains, and deployment targets, and switch instantly with keybindings. - Static site deployers — automate publishing to GitHub Pages, Amazon S3, Google Cloud Storage, or Firebase through the provided commands, without a separate deploy script workflow.
What can you do with easy-jekyll?
- Bloggers: create a new post with
n, preview it withp, and publish to your server withP— the file is named in the minibuffer and front matter is generated automatically. - Multi-site maintainers: define separate settings for each blog and use
;to select a blog,/to select a post directory, and./,to move between directories. - Image-heavy writers: use
easy-jekyll-pull-imageto grab an image from the internet into your images directory, then get the Markdown link inserted automatically. - Automation fans: schedule deployments with timer commands like
easy-jekyll-publish-timer, or useeasy-jekyll-publish-cleverto pick the right deploy target for each blog.
How does easy-jekyll work?
After installing the package, set easy-jekyll-basedir to the directory containing your Jekyll source and configure the target (SSH domain, S3 bucket, GitHub Pages, etc.). Running M-x easy-jekyll opens a mode buffer where each post is listed; key commands like n, p, and P call the underlying Jekyll CLI, rsync, and cloud deployment tools. The package also supports timer-based publishing and a deploy.sh hook for GitHub Pages.
FAQ
How do I install easy-jekyll?
Install from MELPA with M-x package-install easy-jekyll. You need Emacs 25.1 or higher and Jekyll 3.5.1 or higher, and the jekyll command must be on Emacs's PATH — the page recommends exec-path-from-shell if PATH is not inherited.
Can I manage more than one blog?
Yes, define easy-jekyll-bloglist as a list of alists, each containing keys like easy-jekyll-basedir, easy-jekyll-url, easy-jekyll-sshdomain, easy-jekyll-root, and optional bucket names. Switch between blogs with < and > in easy-jekyll-mode.
Does easy-jekyll support GitHub Pages?
Yes, add a deploy.sh script in your blog directory and run M-x easy-jekyll-github-deploy; the script typically checks out the gh-pages branch and pushes. Since the script runs without a password prompt if you set up SSH with keychain, you can automate it fully.
What post formats are supported?
Markdown (.md) is the default, and Textile (.textile) is also supported by entering that extension when creating a post. You can change the default extension by setting easy-jekyll-default-ext, and change the Markdown extension with easy-jekyll-markdown-extension.
How do I change the image directory?
The default image directory is images. Set easy-jekyll-image-directory to a different string, such as "img", to have image helpers look there and generate links pointing to that directory.








