Scheduling a post with Zola and Emile

UPDATE 2022: this post is deprecated, since emile 0.3, simpler workflow to schedule post is available.

In a previous post, I’ve explained how I managed scheduling post with a self-hosted Gitea, Cobalt and a fair amount of (messy?) scripting. I have migrated to Zola since and the scripts can’t work anymore. Let’s see how I’m doing it now!


My workflow uses emile, a tool I wrote in Rust to workaround some stuff missing in zola.

On The VPS

Install The Tools

On my VPS, I put emile and zola in /var/www/bin. I also have git and at installed and available in the PATH.

Work Folder

Like before, I have a copy of the blog repository in /var/www/:

$ cd ~/www
$ git clone https://my_git/blog.git

After zola build, we will have the web site to be served in /var/www/blog/public.

Git Hook

In Gitea, I set the post-receive hook for the blog repo as:

/var/www/bin/ > /var/www/bin/call_emile.log 2> /var/www/bin/call_emile_err.log being:

unset GIT_DIR
cd /var/www/blog/
emile git-hook

That’s about it for the server! Everything done by my previous shell and awk scripts is manage by emile now.

On The Desktop


Being on Windows, I’ve set some PowerShell functions to create a new post and serving the blog from anywhere:

Function Create-Zola-Post {
Param([string] $Title)
Set-Location -Path H:\Dev\blog\
emile new "$Title"

Function Zola-Serve {
Set-Location -Path H:\Dev\blog
zola serve --drafts

Set-alias npost Create-Zola-Post
Set-alias serve Zola-Serve

Replace H:\Dev\blog\ by your path and put this snippet in the file shown when you type $profile in PowerShell.

Emile Configuration

In my blog folder, I’m configuring emile like this:

drafts_creation_dir = "content/_drafts/wip/"
drafts_consumption_dir = "content/_drafts/" 
drafts_year_shift = 50
publish_dest = "content/posts/"

Let’s review my workflow now.


When I start a now blog post, I call npost "My blog title" which set current directory to my blog’s one, and call emile new with the title. It creates a draft in drafts_creation_dir. Then I call serve and redirect my browser to localhost:1111, enjoying the live reload from zola.

If ever I change the title of my post, I call emile reslug and it will rename the post with the new title.

Once the post is ready to be published, I move it into drafts_consumption_dir and commit with this kind of message blog_sched "teatime tomorrow" my-blog-title. This will trigger emile on the VPS to schedule the post!

That’s all folks! I hope some will find this useful!