Hugo is a static site generator. It natively supports org-mode, builds fast, and has live reloading.

I have two repos for blog content and settings and hugo output.

I have defined some emacs lisp utilities to make interacting with Hugo easier.

deploy-blog will goto your blog content, run hugo , cleanup old html, and push the updates.

start-blog-server will run hugo server if not already running, and open the webpage in your browser.

My blog workflow is then to startup the server (SPC a a), write some content in org-mode and see it reflected in the browser on each save, and deploy (SPC a b).

All the code:

( require 'cl ) ( require 'dash ) ( setq blog-dir "~/dev/blog" public-blog-dir "~/dev/public-blog" hugo-process "Hugo Server" hugo-server-site "http://localhost:1313/" ) (defmacro with-dir (DIR &rest FORMS) "Execute FORMS in DIR." ( let ((orig-dir ( gensym ))) ` ( progn ( setq , orig-dir default-directory) (cd , DIR) ,@ FORMS (cd , orig-dir)))) (defun deploy-blog () "Run hugo and push changes upstream." (interactive) (with-dir public-blog-dir (shell-command "git rm -rf ." ) (shell-command "git clean -fxd" ) (with-dir blog-dir (->> public-blog-dir (concat "hugo -d " ) shell-command)) (shell-command "git add ." ) (--> (current-time-string) (concat "git commit -m \"" it "\"" ) (shell-command it)) (magit-push-current-to-upstream nil ))) (defun start-blog-server () "Run hugo server if not already running and open its webpage." (interactive) (with-dir blog-dir (unless (get-process hugo-process) (start-process hugo-process nil "hugo" "server" )) (browse-url hugo-server-site))) (defun end-blog-server () "End hugo server process if running." (interactive) (--when-let (get-process hugo-process) (delete-process it))) (spacemacs/set-leader-keys (kbd "ab" ) 'deploy-blog ) (spacemacs/set-leader-keys (kbd "aa" ) 'start-blog-server ) (spacemacs/set-leader-keys (kbd "ae" ) 'end-blog-server )

For reference, this blog post is an ordinary org file with just the headers:

#+TITLE : An Emacs Blogging Workflow #+SLUG : org-mode-blogging #+DATE : 2017-06-20 #+CATEGORIES : emacs org-mode #+SUMMARY : Easy org-mode blogging with Hugo #+DRAFT : false

And hugo takes care of the rest.